import 'dart:io'; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; /// Gestiona los permisos necesarios para Nearby Connections class ServicioPermisos { /// Solicita todos los permisos necesarios para el modo multidispositivo. /// Retorna true si todos los permisos fueron concedidos. static Future solicitarPermisosNearby(BuildContext context) async { final permisos = [ Permission.locationWhenInUse, ]; // Android 12+ necesita permisos BT específicos if (Platform.isAndroid) { permisos.addAll([ Permission.bluetoothAdvertise, Permission.bluetoothConnect, Permission.bluetoothScan, Permission.nearbyWifiDevices, ]); } // Solicitar todos final resultados = await permisos.request(); // Verificar cuáles fueron denegados final denegados = []; for (final entry in resultados.entries) { if (!entry.value.isGranted) { denegados.add(_nombrePermiso(entry.key)); } } if (denegados.isEmpty) return true; // Mostrar diálogo con los permisos que faltan if (context.mounted) { final abrirConfig = await showDialog( context: context, builder: (ctx) => AlertDialog( title: const Text('Permisos necesarios'), content: Text( 'Para el modo multijugador necesitamos:\n\n' '${denegados.map((d) => '• $d').join('\n')}\n\n' '¿Abrir configuración de la app?', ), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, false), child: const Text('Cancelar'), ), TextButton( onPressed: () => Navigator.pop(ctx, true), child: const Text('Abrir configuración'), ), ], ), ); if (abrirConfig == true) { await openAppSettings(); } } return false; } static String _nombrePermiso(Permission p) { if (p == Permission.locationWhenInUse) return 'Ubicación'; if (p == Permission.bluetoothAdvertise) return 'Bluetooth (anunciar)'; if (p == Permission.bluetoothConnect) return 'Bluetooth (conectar)'; if (p == Permission.bluetoothScan) return 'Bluetooth (escanear)'; if (p == Permission.nearbyWifiDevices) return 'Wi-Fi cercano'; return p.toString(); } }