From a7a34ffd6c81d0b0cccd64f4a4a90b5815972231 Mon Sep 17 00:00:00 2001 From: r4khul Date: Sat, 14 Feb 2026 22:06:36 +0530 Subject: [PATCH 1/3] Extend permission denied handling functionality to location toggle tracking in main screen --- lib/main_screen.dart | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/main_screen.dart b/lib/main_screen.dart index 2d9bbcf..c158c67 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -1,3 +1,4 @@ +import 'package:app_settings/app_settings.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:traccar_client/main.dart'; @@ -73,6 +74,13 @@ class _MainScreenState extends State { } } + bool isPermissionDeniedError(PlatformException error) { + final errorDetails = '${error.code} ${error.message ?? ''}'.toLowerCase(); + return errorDetails.contains('denied') || + errorDetails.contains('permission_denied') || + errorDetails.contains('access_denied'); + } + Widget _buildTrackingCard() { return Card( child: Padding( @@ -105,7 +113,22 @@ class _MainScreenState extends State { _checkBatteryOptimizations(context); } } on PlatformException catch (error) { - messengerKey.currentState?.showSnackBar(SnackBar(content: Text(error.message ?? error.code))); + final isPermissionError = isPermissionDeniedError(error); + if (!mounted) return; + messengerKey.currentState?.showSnackBar( + SnackBar( + content: Text(error.message ?? error.code), + duration: const Duration(seconds: 4), + action: isPermissionError + ? SnackBarAction( + label: AppLocalizations.of(context)!.settingsTitle, + onPressed: () => AppSettings.openAppSettings( + type: AppSettingsType.settings, + ), + ) + : null, + ), + ); } } else { FirebaseCrashlytics.instance.log('tracking_toggle_stop'); From e309a7729a142fd2254681d7769b446cbfdd4cc0 Mon Sep 17 00:00:00 2001 From: r4khul Date: Sat, 14 Feb 2026 22:57:57 +0530 Subject: [PATCH 2/3] Check permission denial using background geolocation provider state instead of platform exception based string matching --- lib/main_screen.dart | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/main_screen.dart b/lib/main_screen.dart index c158c67..a55cb17 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -74,11 +74,10 @@ class _MainScreenState extends State { } } - bool isPermissionDeniedError(PlatformException error) { - final errorDetails = '${error.code} ${error.message ?? ''}'.toLowerCase(); - return errorDetails.contains('denied') || - errorDetails.contains('permission_denied') || - errorDetails.contains('access_denied'); + Future _isPermissionDenied() async { + final providerState = await bg.BackgroundGeolocation.providerState; + return providerState.status == bg.ProviderChangeEvent.AUTHORIZATION_STATUS_DENIED || + providerState.status == bg.ProviderChangeEvent.AUTHORIZATION_STATUS_RESTRICTED; } Widget _buildTrackingCard() { @@ -113,7 +112,7 @@ class _MainScreenState extends State { _checkBatteryOptimizations(context); } } on PlatformException catch (error) { - final isPermissionError = isPermissionDeniedError(error); + final isPermissionError = await _isPermissionDenied(); if (!mounted) return; messengerKey.currentState?.showSnackBar( SnackBar( From fcbdea009024a1bb868cf6b52451b988f5bc685d Mon Sep 17 00:00:00 2001 From: r4khul Date: Sun, 15 Feb 2026 10:37:45 +0530 Subject: [PATCH 3/3] Inline permission status check in catch block and remove _isPermissionDenied() --- lib/main_screen.dart | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/main_screen.dart b/lib/main_screen.dart index a55cb17..08e0155 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -74,12 +74,6 @@ class _MainScreenState extends State { } } - Future _isPermissionDenied() async { - final providerState = await bg.BackgroundGeolocation.providerState; - return providerState.status == bg.ProviderChangeEvent.AUTHORIZATION_STATUS_DENIED || - providerState.status == bg.ProviderChangeEvent.AUTHORIZATION_STATUS_RESTRICTED; - } - Widget _buildTrackingCard() { return Card( child: Padding( @@ -112,7 +106,9 @@ class _MainScreenState extends State { _checkBatteryOptimizations(context); } } on PlatformException catch (error) { - final isPermissionError = await _isPermissionDenied(); + final providerState = await bg.BackgroundGeolocation.providerState; + final isPermissionError = providerState.status == bg.ProviderChangeEvent.AUTHORIZATION_STATUS_DENIED || + providerState.status == bg.ProviderChangeEvent.AUTHORIZATION_STATUS_RESTRICTED; if (!mounted) return; messengerKey.currentState?.showSnackBar( SnackBar(