import 'package:permission_handler/permission_handler.dart'; import 'package:flutter/foundation.dart' show kIsWeb; /// Information about a permission that the application cares about. /// /// Add new entries to [appPermissions] when the app requires additional /// runtime permissions. The UI that drives the "permissions screen" reads this /// list and will automatically include new permissions without any further /// changes. class PermissionInfo { const PermissionInfo({ required this.permission, required this.label, this.description, }); final Permission permission; final String label; final String? description; } /// The set of permissions the app will check/request from the user. /// /// Currently contains the permissions actually referenced in the codebase, but /// it should be expanded as new features are added. Declaring a permission /// here ensures it appears on the permissions screen and is considered when /// performing bulk checks/requests. List get appPermissions { // On web, browser notifications are handled separately; avoid including // the notification runtime permission in the app permissions list so the // permissions screen and bulk request flow do not attempt to enforce it. if (kIsWeb) { return [ PermissionInfo( permission: Permission.location, label: 'Location', description: 'Access your location for geofencing', ), ]; } return [ PermissionInfo( permission: Permission.notification, label: 'Notifications', description: 'Deliver alerts and sounds', ), PermissionInfo( permission: Permission.location, label: 'Location', description: 'Access your location for geofencing', ), // add new permissions here as necessary ]; } /// Returns the current status for every permission in [appPermissions]. Future> getAllStatuses() async { final map = {}; for (final info in appPermissions) { map[info.permission] = await info.permission.status; } return map; } /// Requests [permission] and returns the resulting status. Future requestPermission(Permission permission) async { return permission.request(); } /// Convenience that requests every permission that is currently not granted. /// /// Returns the full status map after requesting. Future> requestAllNeeded() async { final statuses = await getAllStatuses(); for (final entry in statuses.entries) { if (!entry.value.isGranted) { statuses[entry.key] = await entry.key.request(); } } return statuses; }