import 'dart:io'; import 'package:farolero/l10n/generated/app_localizations.dart'; 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(); if (!context.mounted) return false; final l10n = AppLocalizations.of(context)!; // Verificar cuáles fueron denegados final denegados = []; for (final entry in resultados.entries) { if (!entry.value.isGranted) { denegados.add(_nombrePermiso(entry.key, l10n)); } } 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: Text(l10n.permissionsNeededTitle), content: Text( '${l10n.permissionsNeededBody}\n\n' '${denegados.map((d) => '• $d').join('\n')}\n\n' '${l10n.openAppSettingsQuestion}', ), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, false), child: Text(l10n.cancel), ), TextButton( onPressed: () => Navigator.pop(ctx, true), child: Text(l10n.openSettings), ), ], ), ); if (abrirConfig == true) { await openAppSettings(); } } return false; } static String _nombrePermiso(Permission p, AppLocalizations l10n) { if (p == Permission.locationWhenInUse) return l10n.permissionLocation; if (p == Permission.bluetoothAdvertise) { return l10n.permissionBluetoothAdvertise; } if (p == Permission.bluetoothConnect) { return l10n.permissionBluetoothConnect; } if (p == Permission.bluetoothScan) return l10n.permissionBluetoothScan; if (p == Permission.nearbyWifiDevices) return l10n.permissionNearbyWifi; return p.toString(); } }