diff --git a/lib/geolocation_service.dart b/lib/geolocation_service.dart index 574f4b7..0464e7b 100644 --- a/lib/geolocation_service.dart +++ b/lib/geolocation_service.dart @@ -27,6 +27,11 @@ class GeolocationService { static Future onEnabledChange(bool enabled) async { FirebaseCrashlytics.instance.log('geolocation_enabled:$enabled'); + // Auto-restart if tracking lock is enabled and service was disabled + if (!enabled && (Preferences.instance.getBool(Preferences.trackingLock) ?? false)) { + FirebaseCrashlytics.instance.log('tracking_lock_restart'); + await bg.BackgroundGeolocation.start(); + } if (Preferences.instance.getBool(Preferences.wakelock) ?? false) { if (!enabled) { await WakelockPartialAndroid.release(); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 1958a56..d836ed2 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -25,6 +25,8 @@ "bufferLabel": "Offline buffering", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "trackingLockLabel": "Prevent tracking from being disabled automatically", + "trackingLockMessage": "Tracking is locked. Disable lock in settings to turn off.", "trackingLabel": "Continuous tracking", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/main_screen.dart b/lib/main_screen.dart index b088f00..825d7bc 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -135,6 +135,18 @@ class _MainScreenState extends State { ); } } else { + // Check if tracking lock is enabled + if (Preferences.instance.getBool(Preferences.trackingLock) ?? false) { + if (mounted) { + messengerKey.currentState?.showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context)!.trackingLockMessage), + duration: const Duration(seconds: 2), + ), + ); + } + return; + } FirebaseCrashlytics.instance.log('tracking_toggle_stop'); bg.BackgroundGeolocation.stop(); } diff --git a/lib/preferences.dart b/lib/preferences.dart index 44ff9d0..c7042b1 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -21,6 +21,7 @@ class Preferences { static const String wakelock = 'wakelock'; static const String stopDetection = 'stop_detection'; static const String password = 'password'; + static const String trackingLock = 'tracking_lock'; static const String lastTimestamp = 'lastTimestamp'; static const String lastLatitude = 'lastLatitude'; @@ -40,7 +41,7 @@ class Preferences { cacheOptions: SharedPreferencesWithCacheOptions( allowList: { id, url, accuracy, distance, interval, angle, heartbeat, - fastestInterval, buffer, wakelock, stopDetection, password, + fastestInterval, buffer, wakelock, stopDetection, password, trackingLock, lastTimestamp, lastLatitude, lastLongitude, lastHeading, }, ), diff --git a/lib/push_service.dart b/lib/push_service.dart index de8ff9f..6e41537 100644 --- a/lib/push_service.dart +++ b/lib/push_service.dart @@ -39,7 +39,10 @@ class PushService { case 'positionPeriodic': await bg.BackgroundGeolocation.start(); case 'positionStop': - await bg.BackgroundGeolocation.stop(); + if (!(Preferences.instance.getBool(Preferences.trackingLock) ?? false)) { + await bg.BackgroundGeolocation.stop(); + } + break; case 'factoryReset': await PasswordService.setPassword(''); } diff --git a/lib/quick_actions.dart b/lib/quick_actions.dart index 6cf86dd..c4e8218 100644 --- a/lib/quick_actions.dart +++ b/lib/quick_actions.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:quick_actions/quick_actions.dart'; import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; +import 'package:traccar_client/preferences.dart'; import 'l10n/app_localizations.dart'; @@ -27,7 +28,10 @@ class _QuickActionsInitializerState extends State { case 'start': await bg.BackgroundGeolocation.start(); case 'stop': - await bg.BackgroundGeolocation.stop(); + if (!(Preferences.instance.getBool(Preferences.trackingLock) ?? false)) { + await bg.BackgroundGeolocation.stop(); + } + break; case 'sos': try { await bg.BackgroundGeolocation.getCurrentPosition(samples: 1, persist: true, extras: {'alarm': 'sos'}); diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index ccc8b1c..b093a4e 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -231,6 +231,15 @@ class _SettingsScreenState extends State { setState(() {}); }, ), + if (advanced) + SwitchListTile( + title: Text(AppLocalizations.of(context)!.trackingLockLabel), + value: Preferences.instance.getBool(Preferences.trackingLock) ?? false, + onChanged: (value) async { + await Preferences.instance.setBool(Preferences.trackingLock, value); + setState(() {}); + }, + ), if (advanced) ListTile( title: Text(AppLocalizations.of(context)!.passwordLabel),