From 03b18afcb180e52db15178180f413102fbe499eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:26:35 +0000 Subject: [PATCH 001/235] Bump firebase_crashlytics from 5.0.4 to 5.0.5 Bumps [firebase_crashlytics](https://github.com/firebase/flutterfire/tree/main/packages/firebase_crashlytics) from 5.0.4 to 5.0.5. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_crashlytics-v5.0.5/packages/firebase_crashlytics) --- updated-dependencies: - dependency-name: firebase_crashlytics dependency-version: 5.0.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 12 ++++++------ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 7ff85c95..291704b3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: "direct main" description: name: firebase_crashlytics - sha256: c3ebe3ed9f3b1d36c0864a4a28b041fcc2686f11fb2a4f7891319ea8d1d161cc + sha256: bd4eadd620071ae48ef0e3617499be2a0ea4062d6d5c6fea6c1cec41ebbb2435 url: "https://pub.dev" source: hosted - version: "5.0.4" + version: "5.0.5" firebase_crashlytics_platform_interface: dependency: transitive description: @@ -369,10 +369,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" mobile_scanner: dependency: "direct main" description: @@ -598,10 +598,10 @@ packages: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.7" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index eaa8c30f..ceeb294f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: firebase_core: ^4.2.1 firebase_messaging: ^16.0.4 firebase_analytics: ^12.0.4 - firebase_crashlytics: ^5.0.4 + firebase_crashlytics: ^5.0.5 quick_actions: ^1.1.0 rate_my_app: ^2.3.2 shared_preferences_android: ^2.4.15 From edba428b02a831a8f2e09c46ed17358d41487011 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:26:38 +0000 Subject: [PATCH 002/235] Bump app_links from 6.4.1 to 7.0.0 Bumps [app_links](https://github.com/llfbandit/app_links) from 6.4.1 to 7.0.0. - [Release notes](https://github.com/llfbandit/app_links/releases) - [Commits](https://github.com/llfbandit/app_links/commits) --- updated-dependencies: - dependency-name: app_links dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- pubspec.lock | 12 ++++++------ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 7ff85c95..faa318ec 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: "direct main" description: name: app_links - sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8" + sha256: "3462d9defc61565fde4944858b59bec5be2b9d5b05f20aed190adb3ad08a7abc" url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "7.0.0" app_links_linux: dependency: transitive description: @@ -369,10 +369,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" mobile_scanner: dependency: "direct main" description: @@ -598,10 +598,10 @@ packages: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.7" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index eaa8c30f..b64964de 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.1.3 flutter_secure_storage: ^9.2.4 - app_links: ^6.4.1 + app_links: ^7.0.0 dev_dependencies: flutter_test: From fea67a330db70d50276a75cbb19a2460fd4adc1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:20:14 +0000 Subject: [PATCH 003/235] Bump shared_preferences_android from 2.4.15 to 2.4.16 Bumps [shared_preferences_android](https://github.com/flutter/packages/tree/main/packages/shared_preferences) from 2.4.15 to 2.4.16. - [Commits](https://github.com/flutter/packages/commits/shared_preferences_android-v2.4.16/packages/shared_preferences) --- updated-dependencies: - dependency-name: shared_preferences_android dependency-version: 2.4.16 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 291704b3..06bb31a3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -505,10 +505,10 @@ packages: dependency: "direct main" description: name: shared_preferences_android - sha256: "34266009473bf71d748912da4bf62d439185226c03e01e2d9687bc65bbfcb713" + sha256: "07d552dbe8e71ed720e5205e760438ff4ecfb76ec3b32ea664350e2ca4b0c43b" url: "https://pub.dev" source: hosted - version: "2.4.15" + version: "2.4.16" shared_preferences_foundation: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ceeb294f..265f90e3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: firebase_crashlytics: ^5.0.5 quick_actions: ^1.1.0 rate_my_app: ^2.3.2 - shared_preferences_android: ^2.4.15 + shared_preferences_android: ^2.4.16 wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.1.3 flutter_secure_storage: ^9.2.4 From 3510062c7a0c8a7c1c76c7131812c82d4d1686c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 00:39:01 +0000 Subject: [PATCH 004/235] Bump shared_preferences_android from 2.4.16 to 2.4.17 Bumps [shared_preferences_android](https://github.com/flutter/packages/tree/main/packages/shared_preferences) from 2.4.16 to 2.4.17. - [Commits](https://github.com/flutter/packages/commits/shared_preferences_android-v2.4.17/packages/shared_preferences) --- updated-dependencies: - dependency-name: shared_preferences_android dependency-version: 2.4.17 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 1e63efdd..c43e6889 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -505,10 +505,10 @@ packages: dependency: "direct main" description: name: shared_preferences_android - sha256: "07d552dbe8e71ed720e5205e760438ff4ecfb76ec3b32ea664350e2ca4b0c43b" + sha256: "46a46fd64659eff15f4638bbe19de43f9483f0e0bf024a9fb6b3582064bacc7b" url: "https://pub.dev" source: hosted - version: "2.4.16" + version: "2.4.17" shared_preferences_foundation: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9f077fe2..6744a87f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: firebase_crashlytics: ^5.0.5 quick_actions: ^1.1.0 rate_my_app: ^2.3.2 - shared_preferences_android: ^2.4.16 + shared_preferences_android: ^2.4.17 wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.1.3 flutter_secure_storage: ^9.2.4 From b07750937fe481c633fc74f9bf95b3768024a1bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 00:52:17 +0000 Subject: [PATCH 005/235] Bump flutter_background_geolocation from 4.18.1 to 4.18.2 Bumps [flutter_background_geolocation](https://github.com/transistorsoft/flutter_background_geolocation) from 4.18.1 to 4.18.2. - [Changelog](https://github.com/transistorsoft/flutter_background_geolocation/blob/master/CHANGELOG.md) - [Commits](https://github.com/transistorsoft/flutter_background_geolocation/compare/4.18.1...4.18.2) --- updated-dependencies: - dependency-name: flutter_background_geolocation dependency-version: 4.18.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index c43e6889..eecce998 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -210,10 +210,10 @@ packages: dependency: "direct main" description: name: flutter_background_geolocation - sha256: a7c01238f681bc617bd798fcbc443a4a6f314101441450e7ab7d11939702de20 + sha256: "6910bec29cfed37fe11972c0207411c36d26f62067f2465b22d0c1176da60f6c" url: "https://pub.dev" source: hosted - version: "4.18.1" + version: "4.18.2" flutter_lints: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 6744a87f..e2a6936a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - flutter_background_geolocation: ^4.18.1 + flutter_background_geolocation: ^4.18.2 shared_preferences: ^2.5.3 firebase_core: ^4.2.1 firebase_messaging: ^16.0.4 From 97f605d266cb05b014c85dbdd0e66584b1c2d7cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 02:25:11 +0000 Subject: [PATCH 006/235] Bump shared_preferences_android from 2.4.17 to 2.4.18 Bumps [shared_preferences_android](https://github.com/flutter/packages/tree/main/packages/shared_preferences) from 2.4.17 to 2.4.18. - [Commits](https://github.com/flutter/packages/commits/shared_preferences_android-v2.4.18/packages/shared_preferences) --- updated-dependencies: - dependency-name: shared_preferences_android dependency-version: 2.4.18 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index eecce998..cd0986d5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -505,10 +505,10 @@ packages: dependency: "direct main" description: name: shared_preferences_android - sha256: "46a46fd64659eff15f4638bbe19de43f9483f0e0bf024a9fb6b3582064bacc7b" + sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc" url: "https://pub.dev" source: hosted - version: "2.4.17" + version: "2.4.18" shared_preferences_foundation: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e2a6936a..8025322b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: firebase_crashlytics: ^5.0.5 quick_actions: ^1.1.0 rate_my_app: ^2.3.2 - shared_preferences_android: ^2.4.17 + shared_preferences_android: ^2.4.18 wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.1.3 flutter_secure_storage: ^9.2.4 From dd19920f99e9357d814a1fd3d8940a466cf101a7 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 6 Dec 2025 09:55:38 -0800 Subject: [PATCH 007/235] Update project --- ios/Podfile.lock | 251 ------------------ ios/Runner.xcodeproj/project.pbxproj | 42 +-- .../xcshareddata/swiftpm/Package.resolved | 167 ++++++++++++ .../xcshareddata/xcschemes/Runner.xcscheme | 18 ++ pubspec.lock | 28 +- 5 files changed, 223 insertions(+), 283 deletions(-) create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 5134569a..8fd9e3dc 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,279 +1,28 @@ PODS: - - app_links (6.4.1): - - Flutter - - background_fetch (1.4.0): - - Flutter - - CocoaLumberjack (3.8.5): - - CocoaLumberjack/Core (= 3.8.5) - - CocoaLumberjack/Core (3.8.5) - - Firebase/CoreOnly (12.4.0): - - FirebaseCore (~> 12.4.0) - - Firebase/Crashlytics (12.4.0): - - Firebase/CoreOnly - - FirebaseCrashlytics (~> 12.4.0) - - Firebase/Messaging (12.4.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 12.4.0) - - firebase_analytics (12.0.3): - - firebase_core - - FirebaseAnalytics (= 12.4.0) - - Flutter - - firebase_core (4.2.0): - - Firebase/CoreOnly (= 12.4.0) - - Flutter - - firebase_crashlytics (5.0.3): - - Firebase/Crashlytics (= 12.4.0) - - firebase_core - - Flutter - - firebase_messaging (16.0.3): - - Firebase/Messaging (= 12.4.0) - - firebase_core - - Flutter - - FirebaseAnalytics (12.4.0): - - FirebaseAnalytics/Default (= 12.4.0) - - FirebaseCore (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - FirebaseAnalytics/Default (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) - - GoogleAppMeasurement/Default (= 12.4.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - FirebaseCore (12.4.0): - - FirebaseCoreInternal (~> 12.4.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreExtension (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseCoreInternal (12.4.0): - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseCrashlytics (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) - - FirebaseRemoteConfigInterop (~> 12.4.0) - - FirebaseSessions (~> 12.4.0) - - GoogleDataTransport (~> 10.1) - - GoogleUtilities/Environment (~> 8.1) - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - FirebaseInstallations (12.4.0): - - FirebaseCore (~> 12.4.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - PromisesObjC (~> 2.4) - - FirebaseMessaging (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) - - GoogleDataTransport (~> 10.1) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Reachability (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - nanopb (~> 3.30910.0) - - FirebaseRemoteConfigInterop (12.4.0) - - FirebaseSessions (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseCoreExtension (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) - - GoogleDataTransport (~> 10.1) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - nanopb (~> 3.30910.0) - - PromisesSwift (~> 2.1) - Flutter (1.0.0) - - flutter_background_geolocation (4.18.0): - - CocoaLumberjack (~> 3.8.5) - - Flutter - flutter_secure_storage (6.0.0): - Flutter - - GoogleAdsOnDeviceConversion (3.1.0): - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/Core (12.4.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/Default (12.4.0): - - GoogleAdsOnDeviceConversion (~> 3.1.0) - - GoogleAppMeasurement/Core (= 12.4.0) - - GoogleAppMeasurement/IdentitySupport (= 12.4.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/IdentitySupport (12.4.0): - - GoogleAppMeasurement/Core (= 12.4.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - GoogleDataTransport (10.1.0): - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - GoogleUtilities/AppDelegateSwizzler (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.0): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.0)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.0) - - GoogleUtilities/Reachability (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - mobile_scanner (7.0.0): - - Flutter - - FlutterMacOS - - nanopb (3.30910.0): - - nanopb/decode (= 3.30910.0) - - nanopb/encode (= 3.30910.0) - - nanopb/decode (3.30910.0) - - nanopb/encode (3.30910.0) - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - PromisesObjC (2.4.0) - - PromisesSwift (2.4.0): - - PromisesObjC (= 2.4.0) - - quick_actions_ios (0.0.1): - - Flutter - rate_my_app (2.3.2): - Flutter - FlutterMacOS - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS DEPENDENCIES: - - app_links (from `.symlinks/plugins/app_links/ios`) - - background_fetch (from `.symlinks/plugins/background_fetch/ios`) - - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) - - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - Flutter (from `Flutter`) - - flutter_background_geolocation (from `.symlinks/plugins/flutter_background_geolocation/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - - mobile_scanner (from `.symlinks/plugins/mobile_scanner/darwin`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`) - rate_my_app (from `.symlinks/plugins/rate_my_app/darwin`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - -SPEC REPOS: - trunk: - - CocoaLumberjack - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreExtension - - FirebaseCoreInternal - - FirebaseCrashlytics - - FirebaseInstallations - - FirebaseMessaging - - FirebaseRemoteConfigInterop - - FirebaseSessions - - GoogleAdsOnDeviceConversion - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleUtilities - - nanopb - - PromisesObjC - - PromisesSwift EXTERNAL SOURCES: - app_links: - :path: ".symlinks/plugins/app_links/ios" - background_fetch: - :path: ".symlinks/plugins/background_fetch/ios" - firebase_analytics: - :path: ".symlinks/plugins/firebase_analytics/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_crashlytics: - :path: ".symlinks/plugins/firebase_crashlytics/ios" - firebase_messaging: - :path: ".symlinks/plugins/firebase_messaging/ios" Flutter: :path: Flutter - flutter_background_geolocation: - :path: ".symlinks/plugins/flutter_background_geolocation/ios" flutter_secure_storage: :path: ".symlinks/plugins/flutter_secure_storage/ios" - mobile_scanner: - :path: ".symlinks/plugins/mobile_scanner/darwin" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" - quick_actions_ios: - :path: ".symlinks/plugins/quick_actions_ios/ios" rate_my_app: :path: ".symlinks/plugins/rate_my_app/darwin" - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" SPEC CHECKSUMS: - app_links: 3dbc685f76b1693c66a6d9dd1e9ab6f73d97dc0a - background_fetch: 81d0f20490f0126a1c29709e458f47a69e80f44e - CocoaLumberjack: 6a459bc897d6d80bd1b8c78482ec7ad05dffc3f0 - Firebase: f07b15ae5a6ec0f93713e30b923d9970d144af3e - firebase_analytics: 1d024068b1d4707d5ba7a42a12976ddf3316d835 - firebase_core: 744984dbbed8b3036abf34f0b98d80f130a7e464 - firebase_crashlytics: f3a9a4338ab99b67042f64e9e22e1bf349cb44ed - firebase_messaging: 82c70650c426a0a14873e1acdb9ec2b443c4e8b4 - FirebaseAnalytics: 0fc2b20091f0ddd21bf73397cf8f0eb5346dc24f - FirebaseCore: bb595f3114953664e3c1dc032f008a244147cfd3 - FirebaseCoreExtension: 7e1f7118ee970e001a8013719fb90950ee5e0018 - FirebaseCoreInternal: d7f5a043c2cd01a08103ab586587c1468047bca6 - FirebaseCrashlytics: a6ece278a837c7e88de2d9b5da0a3542f2342395 - FirebaseInstallations: ae9f4902cb5bf1d0c5eaa31ec1f4e5495a0714e2 - FirebaseMessaging: d33971b7bb252745ea6cd31ab190d1a1df4b8ed5 - FirebaseRemoteConfigInterop: 1e31ec72b89c9924367c59bfb5ec9ab60d1d6766 - FirebaseSessions: ba7c7a7ca8696a8d540eb3fe3800fbe98c79786d Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - flutter_background_geolocation: 556bbe936fe3071c5a64888cd9581ef18f61d6a8 flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 - GoogleAdsOnDeviceConversion: e03a386840803ea7eef3fd22a061930142c039c1 - GoogleAppMeasurement: 1e718274b7e015cefd846ac1fcf7820c70dc017d - GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93 - nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 - quick_actions_ios: 500fcc11711d9f646739093395c4ae8eec25f779 rate_my_app: cbb89973f870601f80f7bad63aba107260cabc5b - shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb PODFILE CHECKSUM: ce2a4dd764e1c7aeed6a7cdc5e61d092b6dc6d32 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index bf50ef9f..4533c733 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 86ABD4FD2DCDB6B60041010B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 86ABD4FC2DCDB6B60041010B /* PrivacyInfo.xcprivacy */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; @@ -53,6 +54,7 @@ 50797FECAA48F3999E66543E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 86ABD4FC2DCDB6B60041010B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 86C43E8F2E65265A0098728F /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; @@ -85,6 +87,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, F301A0628B4B67129B4EF6BC /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -103,6 +106,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -206,7 +210,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, B103AE670B136CF320D263A0 /* [CP] Embed Pods Frameworks */, - A723026CD722D6080D522023 /* [CP] Copy Pods Resources */, 8D2D9F72CCBD33BB3AF0B2DE /* FlutterFire: "flutterfire upload-crashlytics-symbols" */, ); buildRules = ( @@ -214,6 +217,9 @@ dependencies = ( ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; @@ -247,6 +253,9 @@ Base, ); mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; @@ -352,23 +361,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A723026CD722D6080D522023 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; AAF19D00E31B31B06E129F93 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -787,6 +779,20 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..15f7fecc --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,167 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5", + "version" : "1.2024072200.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "61b85103a1aeed8218f17c794687781505fbbef5", + "version" : "11.2.0" + } + }, + { + "identity" : "cocoalumberjack", + "kind" : "remoteSourceControl", + "location" : "https://github.com/CocoaLumberjack/CocoaLumberjack.git", + "state" : { + "revision" : "a9ed4b6f9bdedce7d77046f43adfb8ce1fd54114", + "version" : "3.9.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "087bb95235f676c1a37e928769a5b6645dcbd325", + "version" : "12.6.0" + } + }, + { + "identity" : "flutterfire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/flutterfire", + "state" : { + "revision" : "1fc2adfbeb6e132e49ba72d04c727227f9827b3e", + "version" : "4.2.1-firebase-core-swift" + } + }, + { + "identity" : "google-ads-on-device-conversion-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk", + "state" : { + "revision" : "35b601a60fbbea2de3ea461f604deaaa4d8bbd0c", + "version" : "3.2.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "c2d59acf17a8ba7ed80a763593c67c9c7c006ad1", + "version" : "12.5.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", + "version" : "10.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "60da361632d0de02786f709bdc0c4df340f7613e", + "version" : "8.1.0" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6", + "version" : "1.69.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "fb7f2740b1570d2f7599c6bb9531bf4fad6974b7", + "version" : "5.0.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe", + "version" : "101.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "swift-log", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-log", + "state" : { + "revision" : "b1fa4ef41fe21b13120c034854042d12c43f66b2", + "version" : "1.7.1" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "c169a5744230951031770e27e475ff6eefe51f9d", + "version" : "1.33.3" + } + }, + { + "identity" : "transistor-background-fetch", + "kind" : "remoteSourceControl", + "location" : "https://github.com/transistorsoft/transistor-background-fetch.git", + "state" : { + "revision" : "185ebdd684eac1796829db8bd61168f650e04892", + "version" : "4.0.5" + } + } + ], + "version" : 2 +} diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e3773d42..c3fedb29 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + + =3.9.0 <4.0.0" - flutter: ">=3.35.0" + dart: ">=3.10.0 <4.0.0" + flutter: ">=3.38.1" From 4285891bcb3cb6b6dd214f89ce694dbf3db0f150 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 6 Dec 2025 09:56:20 -0800 Subject: [PATCH 008/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 8025322b..61dc9a0f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 9.6.4+112 +version: 9.6.5+113 environment: sdk: ^3.7.2 From c50662a7718baf252fd7eb059144183a1ab9c46c Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 8 Dec 2025 07:25:50 -0800 Subject: [PATCH 009/235] Add customization script --- tool/brand.dart | 143 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 tool/brand.dart diff --git a/tool/brand.dart b/tool/brand.dart new file mode 100644 index 00000000..165fdf71 --- /dev/null +++ b/tool/brand.dart @@ -0,0 +1,143 @@ +import 'dart:io'; + +const appName = 'ACME Client'; +const packageId = 'com.acme.client'; +const version = '1.0.0+1'; +const url = "https://example.com"; +final iconPath = '${Platform.environment['HOME']}/Downloads/icon.png'; + +const keystoreFilePath = 'android/android.keystore'; +const keystoreAlias = 'key'; +const keystorePassword = 'password'; + +Future main() async { + await _generateIcons(iconPath); + await _updateTitle(appName); + await _updatePackageId(packageId); + await _updateVersion(version); + await _updateUrl(url); + await _createKeystore(); + stdout.writeln('Please run `flutterfire configure` now.'); +} + +Future _generateIcons(String icon) async { + final dir = Directory('ios/Runner/Assets.xcassets/AppIcon.appiconset'); + dir.deleteSync(recursive: true); + dir.createSync(); + + File('android/app/src/main/res/drawable/ic_launcher_foreground.xml').delete(); + File('android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml').delete(); + + final f = await _writeTempYaml('flutter_launcher_icons.yaml', ''' +flutter_launcher_icons: + android: true + ios: true + image_path: "$icon" + remove_alpha_ios: true +'''); + await _run('flutter', ['pub', 'run', 'flutter_launcher_icons']); + await f.delete(); + + await _replaceInFile( + 'android/app/src/main/AndroidManifest.xml', + RegExp(r'\s*', multiLine: true), + '', + ); +} + +Future _updateTitle(String name) async { + await _replaceInFile( + 'android/app/src/main/AndroidManifest.xml', + RegExp(r'android:label="[^"]*"'), + 'android:label="$name"', + ); + + await _replaceInFile( + 'ios/Runner/Info.plist', + RegExp(r'CFBundleDisplayName\s*.*?'), + 'CFBundleDisplayName\n\t$name', + ); +} + +Future _updatePackageId(String id) async { + await _replaceInFile( + 'android/app/build.gradle.kts', + RegExp(r'applicationId = ".*?"'), + 'applicationId = "$id"', + ); + + await _replaceInFile( + 'ios/Runner.xcodeproj/project.pbxproj', + RegExp(r'PRODUCT_BUNDLE_IDENTIFIER = org\.traccar.*?;'), + 'PRODUCT_BUNDLE_IDENTIFIER = $id;', + ); +} + +Future _updateVersion(String version) async { + await _replaceInFile( + 'pubspec.yaml', + RegExp(r'^version:\s*.*$', multiLine: true), + 'version: $version', + ); +} + +Future _updateUrl(String url) async { + await _replaceInFile( + 'lib/screens/main_screen.dart', + RegExp(r'https://demo\.traccar\.org'), + url, + ); +} + +Future _createKeystore() async { + final args = [ + '-genkeypair', + '-v', + '-keystore', keystoreFilePath, + '-alias', keystoreAlias, + '-keyalg', 'RSA', + '-keysize', '2048', + '-validity', '10000', + '-storepass', keystorePassword, + '-keypass', keystorePassword, + '-dname', 'CN=Brand, OU=Dev, O=Company, L=City, S=State, C=US', + ]; + await _run('keytool', args); + + final file = File('android/key.properties'); + final content = ''' +storePassword=$keystorePassword +keyPassword=$keystorePassword +keyAlias=$keystoreAlias +storeFile=../../$keystoreFilePath +'''; + await file.writeAsString(content); + + await _replaceInFile( + 'android/app/build.gradle.kts', + RegExp(r'val\s+keystorePropertiesFile\s*=.*'), + 'val keystorePropertiesFile = rootProject.file("key.properties")', + ); +} + +Future _writeTempYaml(String name, String content) async { + final file = File(name); + await file.writeAsString(content); + return file; +} + +Future _replaceInFile(String path, RegExp pattern, String replacement) async { + final file = File(path); + if (!await file.exists()) return; + final text = await file.readAsString(); + final newText = text.replaceAll(pattern, replacement); + if (newText != text) await file.writeAsString(newText); +} + +Future _run(String cmd, List args) async { + final proc = await Process.start(cmd, args); + await stdout.addStream(proc.stdout); + await stderr.addStream(proc.stderr); + final code = await proc.exitCode; + if (code != 0) throw Exception('$cmd ${args.join(" ")} failed ($code)'); +} From 047e2b5c79489da96155a872ab073800d87c862b Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 8 Dec 2025 07:30:54 -0800 Subject: [PATCH 010/235] Add dev dependency --- pubspec.lock | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ pubspec.yaml | 1 + 2 files changed, 105 insertions(+) diff --git a/pubspec.lock b/pubspec.lock index f2cbeab0..b80644ea 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -41,6 +41,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" async: dependency: transitive description: @@ -73,6 +89,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" clock: dependency: transitive description: @@ -89,6 +121,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" fake_async: dependency: transitive description: @@ -214,6 +254,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.18.2" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" flutter_lints: dependency: "direct dev" description: @@ -301,6 +349,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + image: + dependency: transitive + description: + name: image + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + url: "https://pub.dev" + source: hosted + version: "4.5.4" intl: dependency: "direct main" description: @@ -317,6 +373,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" leak_tracker: dependency: transitive description: @@ -437,6 +501,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + url: "https://pub.dev" + source: hosted + version: "7.0.1" platform: dependency: transitive description: @@ -453,6 +525,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + posix: + dependency: transitive + description: + name: posix + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" + url: "https://pub.dev" + source: hosted + version: "6.0.3" quick_actions: dependency: "direct main" description: @@ -602,6 +682,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.7" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" vector_math: dependency: transitive description: @@ -650,6 +738,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" sdks: dart: ">=3.10.0 <4.0.0" flutter: ">=3.38.1" diff --git a/pubspec.yaml b/pubspec.yaml index 61dc9a0f..1d23da0c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,6 +30,7 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^6.0.0 + flutter_launcher_icons: ^0.14.4 flutter: uses-material-design: true From 7d47f8b3c29d2576cfc883c033186fb04a2b7748 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:23:17 +0000 Subject: [PATCH 011/235] Bump shared_preferences from 2.5.3 to 2.5.4 Bumps [shared_preferences](https://github.com/flutter/packages/tree/main/packages/shared_preferences) from 2.5.3 to 2.5.4. - [Commits](https://github.com/flutter/packages/commits/shared_preferences-v2.5.4/packages/shared_preferences) --- updated-dependencies: - dependency-name: shared_preferences dependency-version: 2.5.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index b80644ea..9b1c7c98 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -577,10 +577,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" shared_preferences_android: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 1d23da0c..3a0c7f6d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: sdk: flutter intl: any flutter_background_geolocation: ^4.18.2 - shared_preferences: ^2.5.3 + shared_preferences: ^2.5.4 firebase_core: ^4.2.1 firebase_messaging: ^16.0.4 firebase_analytics: ^12.0.4 From a84384df34fd5d0927d084bc69b1bd02ac05390a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 10 Dec 2025 07:49:43 -0800 Subject: [PATCH 012/235] Fix URL update script --- tool/brand.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tool/brand.dart b/tool/brand.dart index 165fdf71..4dfed41d 100644 --- a/tool/brand.dart +++ b/tool/brand.dart @@ -83,8 +83,8 @@ Future _updateVersion(String version) async { Future _updateUrl(String url) async { await _replaceInFile( - 'lib/screens/main_screen.dart', - RegExp(r'https://demo\.traccar\.org'), + 'lib/preferences.dart', + RegExp(r'https://demo\.traccar\.org:5055'), url, ); } From 0edbe106962b248bff167e8c662aba63074b3c53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 00:22:42 +0000 Subject: [PATCH 013/235] Bump flutter_secure_storage from 9.2.4 to 10.0.0 Bumps [flutter_secure_storage](https://github.com/mogol/flutter_secure_storage) from 9.2.4 to 10.0.0. - [Release notes](https://github.com/mogol/flutter_secure_storage/releases) - [Commits](https://github.com/mogol/flutter_secure_storage/compare/v9.2.4...v10.0.0) --- updated-dependencies: - dependency-name: flutter_secure_storage dependency-version: 10.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- pubspec.lock | 40 ++++++++++++++++------------------------ pubspec.yaml | 2 +- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 9b1c7c98..1322563d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -287,50 +287,50 @@ packages: dependency: "direct main" description: name: flutter_secure_storage - sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + sha256: da922f2aab2d733db7e011a6bcc4a825b844892d4edd6df83ff156b09a9b2e40 url: "https://pub.dev" source: hosted - version: "9.2.4" - flutter_secure_storage_linux: + version: "10.0.0" + flutter_secure_storage_darwin: dependency: transitive description: - name: flutter_secure_storage_linux - sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + name: flutter_secure_storage_darwin + sha256: "8878c25136a79def1668c75985e8e193d9d7d095453ec28730da0315dc69aee3" url: "https://pub.dev" source: hosted - version: "1.2.3" - flutter_secure_storage_macos: + version: "0.2.0" + flutter_secure_storage_linux: dependency: transitive description: - name: flutter_secure_storage_macos - sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + name: flutter_secure_storage_linux + sha256: "2b5c76dce569ab752d55a1cee6a2242bcc11fdba927078fb88c503f150767cda" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.0.0" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "2.0.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + sha256: "6a1137df62b84b54261dca582c1c09ea72f4f9a4b2fcee21b025964132d5d0c3" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "2.1.0" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + sha256: "3b7c8e068875dfd46719ff57c90d8c459c87f2302ed6b00ff006b3c9fcad1613" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "4.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -365,14 +365,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.2" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" json_annotation: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 3a0c7f6d..854266a1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: shared_preferences_android: ^2.4.18 wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.1.3 - flutter_secure_storage: ^9.2.4 + flutter_secure_storage: ^10.0.0 app_links: ^7.0.0 dev_dependencies: From 2ece60a75623f75492264a61d002132cae0d152c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 00:17:07 +0000 Subject: [PATCH 014/235] Bump mobile_scanner from 7.1.3 to 7.1.4 Bumps [mobile_scanner](https://github.com/juliansteenbakker/mobile_scanner) from 7.1.3 to 7.1.4. - [Release notes](https://github.com/juliansteenbakker/mobile_scanner/releases) - [Changelog](https://github.com/juliansteenbakker/mobile_scanner/blob/develop/CHANGELOG.md) - [Commits](https://github.com/juliansteenbakker/mobile_scanner/compare/v7.1.3...v7.1.4) --- updated-dependencies: - dependency-name: mobile_scanner dependency-version: 7.1.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 1322563d..69d9a3b9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -433,10 +433,10 @@ packages: dependency: "direct main" description: name: mobile_scanner - sha256: "023a71afb4d7cfb5529d0f2636aa8b43db66257905b9486d702085989769c5f2" + sha256: c6184bf2913dd66be244108c9c27ca04b01caf726321c44b0e7a7a1e32d41044 url: "https://pub.dev" source: hosted - version: "7.1.3" + version: "7.1.4" path: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 854266a1..954430a7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: rate_my_app: ^2.3.2 shared_preferences_android: ^2.4.18 wakelock_partial_android: ^1.0.1 - mobile_scanner: ^7.1.3 + mobile_scanner: ^7.1.4 flutter_secure_storage: ^10.0.0 app_links: ^7.0.0 From 6227569548250344d6b2ecc4c6f28b6cfa55e2ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 00:23:15 +0000 Subject: [PATCH 015/235] Bump firebase_core from 4.2.1 to 4.3.0 Bumps [firebase_core](https://github.com/firebase/flutterfire/tree/main/packages/firebase_core) from 4.2.1 to 4.3.0. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_core-v4.3.0/packages/firebase_core) --- updated-dependencies: - dependency-name: firebase_core dependency-version: 4.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 69d9a3b9..2f5b0b1e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -181,10 +181,10 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: "1f2dfd9f535d81f8b06d7a50ecda6eac1e6922191ed42e09ca2c84bd2288927c" + sha256: "29cfa93c771d8105484acac340b5ea0835be371672c91405a300303986f4eba9" url: "https://pub.dev" source: hosted - version: "4.2.1" + version: "4.3.0" firebase_core_platform_interface: dependency: transitive description: @@ -197,10 +197,10 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: ff18fabb0ad0ed3595d2f2c85007ecc794aadecdff5b3bb1460b7ee47cded398 + sha256: a631bbfbfa26963d68046aed949df80b228964020e9155b086eff94f462bbf1f url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.3.1" firebase_crashlytics: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 954430a7..81644e6e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: intl: any flutter_background_geolocation: ^4.18.2 shared_preferences: ^2.5.4 - firebase_core: ^4.2.1 + firebase_core: ^4.3.0 firebase_messaging: ^16.0.4 firebase_analytics: ^12.0.4 firebase_crashlytics: ^5.0.5 From aa6ca4bc65f465f5591113c04388e9515f571331 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 00:43:13 +0000 Subject: [PATCH 016/235] Bump firebase_messaging from 16.0.4 to 16.1.0 Bumps [firebase_messaging](https://github.com/firebase/flutterfire/tree/main/packages/firebase_messaging) from 16.0.4 to 16.1.0. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_messaging-v16.1.0/packages/firebase_messaging) --- updated-dependencies: - dependency-name: firebase_messaging dependency-version: 16.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 16 ++++++++-------- pubspec.yaml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 2f5b0b1e..accd2166 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "8a1f5f3020ef2a74fb93f7ab3ef127a8feea33a7a2276279113660784ee7516a" + sha256: e4a1b612fd2955908e26116075b3a4baf10c353418ca645b4deae231c82bf144 url: "https://pub.dev" source: hosted - version: "1.3.64" + version: "1.3.65" app_links: dependency: "direct main" description: @@ -221,26 +221,26 @@ packages: dependency: "direct main" description: name: firebase_messaging - sha256: "22086f857d2340f5d973776cfd542d3fb30cf98e1c643c3aa4a7520bb12745bb" + sha256: "1ad663fbb6758acec09d7e84a2e6478265f0a517f40ef77c573efd5e0089f400" url: "https://pub.dev" source: hosted - version: "16.0.4" + version: "16.1.0" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: a59920cbf2eb7c83d34a5f354331210ffec116b216dc72d864d8b8eb983ca398 + sha256: ea620e841fbcec62a96984295fc628f53ef5a8da4f53238159719ed0af7db834 url: "https://pub.dev" source: hosted - version: "4.7.4" + version: "4.7.5" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "1183e40e6fd2a279a628951cc3b639fcf5ffe7589902632db645011eb70ebefb" + sha256: "7d0fb6256202515bba8489a3d69c6bc9d52d69a4999bad789053b486c8e7323e" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.1.1" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 81644e6e..97fec55a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: flutter_background_geolocation: ^4.18.2 shared_preferences: ^2.5.4 firebase_core: ^4.3.0 - firebase_messaging: ^16.0.4 + firebase_messaging: ^16.1.0 firebase_analytics: ^12.0.4 firebase_crashlytics: ^5.0.5 quick_actions: ^1.1.0 From 4a44cbc90946f9b3382364928ffd2e524c34bf1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 00:48:38 +0000 Subject: [PATCH 017/235] Bump firebase_crashlytics from 5.0.5 to 5.0.6 Bumps [firebase_crashlytics](https://github.com/firebase/flutterfire/tree/main/packages/firebase_crashlytics) from 5.0.5 to 5.0.6. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_crashlytics-v5.0.6/packages/firebase_crashlytics) --- updated-dependencies: - dependency-name: firebase_crashlytics dependency-version: 5.0.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index accd2166..4976c507 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -205,18 +205,18 @@ packages: dependency: "direct main" description: name: firebase_crashlytics - sha256: bd4eadd620071ae48ef0e3617499be2a0ea4062d6d5c6fea6c1cec41ebbb2435 + sha256: "8d52022ee6fdd224e92c042f297d1fd0ec277195c49f39fa61b8cc500a639f00" url: "https://pub.dev" source: hosted - version: "5.0.5" + version: "5.0.6" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: a8ca502fe3aa48b4f0b9e6e3bc0019085a247b5d1214cd342a189457975662db + sha256: "97c6a97b35e3d3dafe38fb053a65086a1efb125022d292161405848527cc25a4" url: "https://pub.dev" source: hosted - version: "3.8.15" + version: "3.8.16" firebase_messaging: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 97fec55a..f524c6e1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: firebase_core: ^4.3.0 firebase_messaging: ^16.1.0 firebase_analytics: ^12.0.4 - firebase_crashlytics: ^5.0.5 + firebase_crashlytics: ^5.0.6 quick_actions: ^1.1.0 rate_my_app: ^2.3.2 shared_preferences_android: ^2.4.18 From 7411439c3028cea1a2657a5431f118dfce22d07a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 00:59:38 +0000 Subject: [PATCH 018/235] Bump firebase_analytics from 12.0.4 to 12.1.0 Bumps [firebase_analytics](https://github.com/firebase/flutterfire/tree/main/packages/firebase_analytics) from 12.0.4 to 12.1.0. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_analytics-v12.1.0/packages/firebase_analytics) --- updated-dependencies: - dependency-name: firebase_analytics dependency-version: 12.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 12 ++++++------ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 4976c507..13e8cb8c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -157,26 +157,26 @@ packages: dependency: "direct main" description: name: firebase_analytics - sha256: bfb80d92eee10a6585ebd5a7e60de5caf0f2c06329e5676c0578130aea1bfe85 + sha256: "8ca4832c7a6d145ce987fd07d6dfbb8c91d9058178342f20de6305fb77b1b40d" url: "https://pub.dev" source: hosted - version: "12.0.4" + version: "12.1.0" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: "3b803077907def997044774f6c022d8e9204e9c0f5e205e3572d887c93dafd72" + sha256: d00234716f415f89eb5c2cefb1238d7fd2f3120275d71414b84ae434dcdb7a19 url: "https://pub.dev" source: hosted - version: "5.0.4" + version: "5.0.5" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: "0dbd96dbe77b51185319000c0078477fdcffb4abb0018c362dd9afb9845c1e06" + sha256: e42b294e51aedb4bd4b761a886c8d6b473c44b44aa4c0b47cab06b2c66ac3fba url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.6.1+1" firebase_core: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index f524c6e1..c6eb85f2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: shared_preferences: ^2.5.4 firebase_core: ^4.3.0 firebase_messaging: ^16.1.0 - firebase_analytics: ^12.0.4 + firebase_analytics: ^12.1.0 firebase_crashlytics: ^5.0.6 quick_actions: ^1.1.0 rate_my_app: ^2.3.2 From 005eb0ece7f507799cef167c552bf05a45ccf786 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 15 Jan 2026 07:27:28 -0800 Subject: [PATCH 019/235] Upgrade background location lib --- android/app/src/main/AndroidManifest.xml | 2 +- android/build.gradle.kts | 4 -- lib/preferences.dart | 82 ++++++++++++++---------- pubspec.lock | 12 +--- pubspec.yaml | 2 +- 5 files changed, 51 insertions(+), 51 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 4c7c6172..37f934c7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -44,7 +44,7 @@ + android:value="eyJhbGciOiJFZERTQSIsImtpZCI6ImVkMjU1MTktbWFpbi12MSJ9.eyJvcyI6ImFuZHJvaWQiLCJhcHBfaWQiOiJvcmcudHJhY2Nhci5jbGllbnQiLCJvcmRlcl9udW1iZXIiOjE0MDgzLCJyZW5ld2FsX3VybCI6Imh0dHBzOi8vc2hvcC50cmFuc2lzdG9yc29mdC5jb20vY2FydC8zMTg3NDM1NjA1MjA3MToxP25vdGU9OTQ2MSIsImN1c3RvbWVyX2lkIjo4NjE1LCJwcm9kdWN0IjoiZmx1dHRlci1iYWNrZ3JvdW5kLWdlb2xvY2F0aW9uIiwia2V5X3ZlcnNpb24iOjEsImFsbG93ZWRfc3VmZml4ZXMiOlsiLmRldiIsIi5kZXZlbG9wbWVudCIsIi5zdGFnaW5nIiwiLnN0YWdlIiwiLnFhIiwiLnVhdCIsIi50ZXN0IiwiLmRlYnVnIl0sIm1heF9idWlsZF9zdGFtcCI6MjAyNjA3MDYsImdyYWNlX2J1aWxkcyI6MCwiZW50aXRsZW1lbnRzIjpbImNvcmUiXSwiaWF0IjoxNzY1NjQyNzI2fQ.ufcC9IUak4MD7lcbB2CXIIaXHzo1xUauHIFcqyC7onBUxFcpcg2LihIk7cJGFsA_FhsHjRfkSzqQFweD1gdiCA" /> - diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 34d79541..0aee7da8 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ - From 0205a0d1c089070dd6f39e66dc7e264444651acb Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 24 Mar 2026 17:25:36 -0700 Subject: [PATCH 092/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 88360173..b470e664 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 9.7.15+130 +version: 9.7.16+131 environment: sdk: ^3.7.2 From 13af82f3eefd86c113db36cde01e7f7faa4cf786 Mon Sep 17 00:00:00 2001 From: Traccar Bot Date: Wed, 25 Mar 2026 00:36:21 +0000 Subject: [PATCH 093/235] Update translations --- lib/l10n/app_ar.arb | 3 ++- lib/l10n/app_ca.arb | 3 ++- lib/l10n/app_cs.arb | 3 ++- lib/l10n/app_de.arb | 3 ++- lib/l10n/app_es.arb | 3 ++- lib/l10n/app_fa.arb | 3 ++- lib/l10n/app_fi.arb | 3 ++- lib/l10n/app_fr.arb | 3 ++- lib/l10n/app_he.arb | 3 ++- lib/l10n/app_id.arb | 3 ++- lib/l10n/app_it.arb | 3 ++- lib/l10n/app_ja.arb | 3 ++- lib/l10n/app_ko.arb | 3 ++- lib/l10n/app_lt.arb | 3 ++- lib/l10n/app_lv.arb | 3 ++- lib/l10n/app_nl.arb | 3 ++- lib/l10n/app_pl.arb | 3 ++- lib/l10n/app_pt.arb | 3 ++- lib/l10n/app_pt_BR.arb | 3 ++- lib/l10n/app_ru.arb | 3 ++- lib/l10n/app_sl.arb | 3 ++- lib/l10n/app_th.arb | 3 ++- lib/l10n/app_tr.arb | 3 ++- lib/l10n/app_uk.arb | 3 ++- lib/l10n/app_zh.arb | 3 ++- lib/l10n/app_zh_TW.arb | 3 ++- 26 files changed, 52 insertions(+), 26 deletions(-) diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 724c618b..0fde6fa1 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -32,5 +32,6 @@ "passwordError": "كلمة المرور خاطئة", "startAction": "بدء الخدمة", "stopAction": "إيقاف الخدمة", - "sosAction": "ارسال استغاثة" + "sosAction": "ارسال استغاثة", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_ca.arb b/lib/l10n/app_ca.arb index b6b015b9..5a497230 100644 --- a/lib/l10n/app_ca.arb +++ b/lib/l10n/app_ca.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Inicia el servei", "stopAction": "Atura el servei", - "sosAction": "Envia SOS" + "sosAction": "Envia SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index e51e9163..7e067f69 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Spustit službu", "stopAction": "Zastavit službu", - "sosAction": "Odeslat SOS" + "sosAction": "Odeslat SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index b1c10db4..497e27b3 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Dienst starten", "stopAction": "Dienst stoppen", - "sosAction": "SOS senden" + "sosAction": "SOS senden", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 87075da6..b2e4486b 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -32,5 +32,6 @@ "passwordError": "Contraseña incorrecta", "startAction": "Iniciar servicio", "stopAction": "Detener servicio", - "sosAction": "Enviar SOS" + "sosAction": "Enviar SOS", + "disclosureMessage": "Esta aplicación recopila datos de ubicación y actividad en segundo plano y los envía al servidor configurado." } diff --git a/lib/l10n/app_fa.arb b/lib/l10n/app_fa.arb index e2f4fa6d..ba0d621a 100644 --- a/lib/l10n/app_fa.arb +++ b/lib/l10n/app_fa.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "شروع کار", "stopAction": "توقف کار", - "sosAction": "ارسال پیام اضطراری" + "sosAction": "ارسال پیام اضطراری", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 17450e11..75666b10 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -32,5 +32,6 @@ "passwordError": "Väärä salasana", "startAction": "Käynnistä seuranta", "stopAction": "Lopeta seuranta", - "sosAction": "Lähetä SOS" + "sosAction": "Lähetä SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 3ba65b37..b620a64e 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Démarrer le service", "stopAction": "Arrêter le service", - "sosAction": "Envoyer un SOS" + "sosAction": "Envoyer un SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_he.arb b/lib/l10n/app_he.arb index e7a36c31..8c3ac670 100644 --- a/lib/l10n/app_he.arb +++ b/lib/l10n/app_he.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "התחל מעקב", "stopAction": "עצור מעקב", - "sosAction": "שלח SOS" + "sosAction": "שלח SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 78255302..f5066e73 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Mulai layanan", "stopAction": "Hentikan layanan", - "sosAction": "Kirim SOS" + "sosAction": "Kirim SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 77e38a34..9e91ad3a 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -32,5 +32,6 @@ "passwordError": "Password errata", "startAction": "Avvia servizio", "stopAction": "Ferma servizio", - "sosAction": "Invia SOS" + "sosAction": "Invia SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 9ef97323..fdb1d216 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "サービス開始", "stopAction": "サービス停止", - "sosAction": "SOSを送信" + "sosAction": "SOSを送信", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 0ca82021..c13b0d22 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "서비스 시작", "stopAction": "서비스 중지", - "sosAction": "SOS 전송" + "sosAction": "SOS 전송", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_lt.arb b/lib/l10n/app_lt.arb index e2978107..98c693dc 100644 --- a/lib/l10n/app_lt.arb +++ b/lib/l10n/app_lt.arb @@ -32,5 +32,6 @@ "passwordError": "Neteisingas slaptažodis", "startAction": "Įjungti servisą", "stopAction": "Sustabdyti servisą", - "sosAction": "Siųsti SOS" + "sosAction": "Siųsti SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_lv.arb b/lib/l10n/app_lv.arb index aba37cc8..c20554a2 100644 --- a/lib/l10n/app_lv.arb +++ b/lib/l10n/app_lv.arb @@ -32,5 +32,6 @@ "passwordError": "Nepareiza parole", "startAction": "Startēt servisu", "stopAction": "Apturēt servisu", - "sosAction": "Sūtīt SOS" + "sosAction": "Sūtīt SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 20a480bf..af409387 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Service starten", "stopAction": "Service stoppen", - "sosAction": "SOS verzenden" + "sosAction": "SOS verzenden", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index db376c18..253e743c 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -32,5 +32,6 @@ "passwordError": "Błędne hasło", "startAction": "Uruchom usługę", "stopAction": "Zatrzymaj usługę", - "sosAction": "Wyślij SOS" + "sosAction": "Wyślij SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 14195d96..7d2506c1 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Iniciar serviço", "stopAction": "Parar serviço", - "sosAction": "Enviar SOS" + "sosAction": "Enviar SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb index 0112839f..68b00dd2 100644 --- a/lib/l10n/app_pt_BR.arb +++ b/lib/l10n/app_pt_BR.arb @@ -32,5 +32,6 @@ "passwordError": "Senha errada", "startAction": "Iniciar serviço", "stopAction": "Parar serviço", - "sosAction": "Enviar SOS" + "sosAction": "Enviar SOS", + "disclosureMessage": "Este aplicativo coleta dados de localização e atividade em segundo plano e os envia para o servidor configurado." } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 07e3abee..093b30e2 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -32,5 +32,6 @@ "passwordError": "Пароль не верен", "startAction": "Запустить сервис", "stopAction": "Остановить сервис", - "sosAction": "Отправить SOS" + "sosAction": "Отправить SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index cd114887..0f3381c8 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Zaženi storitev", "stopAction": "Ustavi storitev", - "sosAction": "Pošlji SOS" + "sosAction": "Pošlji SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index cb402aa2..45bfb1ce 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -32,5 +32,6 @@ "passwordError": "รหัสผ่านไม่ถูกต้อง", "startAction": "เริ่มต้นบริการ", "stopAction": "หยุดบริการ", - "sosAction": "ส่ง SOS" + "sosAction": "ส่ง SOS", + "disclosureMessage": "แอปนี้จะรวบรวมข้อมูลตำแหน่งที่ตั้งและกิจกรรมต่างๆ ในเบื้องหลัง และส่งไปยังเซิร์ฟเวอร์ที่ตั้งค่าไว้" } diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 335c3bd4..b4d2213b 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Servisi başlat", "stopAction": "Servisi durdur", - "sosAction": "SOS gönder" + "sosAction": "SOS gönder", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 0ba71365..ecde7ad9 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -32,5 +32,6 @@ "passwordError": "Wrong password", "startAction": "Запустити сервіс", "stopAction": "Зупинити сервіс", - "sosAction": "Відправити SOS" + "sosAction": "Відправити SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index b9f3610a..a25bad15 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -32,5 +32,6 @@ "passwordError": "密码错误", "startAction": "启动服务", "stopAction": "停止服务", - "sosAction": "发送求救信号" + "sosAction": "发送求救信号", + "disclosureMessage": "该应用会在后台收集位置和活动数据,并将其发送到配置的服务器。" } diff --git a/lib/l10n/app_zh_TW.arb b/lib/l10n/app_zh_TW.arb index 094f9cea..8b5916b4 100644 --- a/lib/l10n/app_zh_TW.arb +++ b/lib/l10n/app_zh_TW.arb @@ -32,5 +32,6 @@ "passwordError": "密碼錯誤", "startAction": "啟動服務", "stopAction": "停止服務", - "sosAction": "發送SOS求救" + "sosAction": "發送SOS求救", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." } From b03ba52fbcfa7e689fb05a97472070cbdd32891c Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 24 Mar 2026 19:12:19 -0700 Subject: [PATCH 094/235] Update project files --- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- pubspec.lock | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index a422d73b..087932a7 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -41,8 +41,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/firebase/flutterfire", "state" : { - "revision" : "51f0bc14786bd83120d942df340722b4cef93032", - "version" : "4.5.0-firebase-core-swift" + "revision" : "a10a4148e769fadb01b1ff8d6bb76e9137f35b81", + "version" : "4.6.0-firebase-core-swift" } }, { diff --git a/pubspec.lock b/pubspec.lock index b1932467..0a66d007 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -473,10 +473,10 @@ packages: dependency: transitive description: name: native_toolchain_c - sha256: "92b2ca62c8bd2b8d2f267cdfccf9bfbdb7322f778f8f91b3ce5b5cda23a3899f" + sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572" url: "https://pub.dev" source: hosted - version: "0.17.5" + version: "0.17.6" objective_c: dependency: transitive description: From 18d8f1cd58b7924b2caac0dd08d3adc30d34f6b5 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 24 Mar 2026 21:30:38 -0700 Subject: [PATCH 095/235] Update package files --- .../xcshareddata/swiftpm/Package.resolved | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 087932a7..fe0f70af 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/firebase/firebase-ios-sdk", "state" : { - "revision" : "85560b48b0ff099ad83fe53d67df3c67fbc2b7a6", - "version" : "12.10.0" + "revision" : "52548902007e7beda99fcdca31f62eccc4befe38", + "version" : "12.11.0" } }, { @@ -50,8 +50,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk", "state" : { - "revision" : "a5cd95c80e8efdd02155c6cea1cecf743bb683a5", - "version" : "3.3.0" + "revision" : "7b722132d1f2ab421c88a2e5c384c984cebd0d00", + "version" : "3.4.0" } }, { @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/GoogleAppMeasurement.git", "state" : { - "revision" : "68ba955e540dcff5e0805970ef4b1fd0150be100", - "version" : "12.10.0" + "revision" : "1657f705bc70255ff9d66dfcc697a85db164998f", + "version" : "12.11.0" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/gtm-session-fetcher.git", "state" : { - "revision" : "fb7f2740b1570d2f7599c6bb9531bf4fad6974b7", - "version" : "5.0.0" + "revision" : "0be208810d2e8b90fcd2464d1816723b47819fe7", + "version" : "5.2.0" } }, { @@ -131,8 +131,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/transistorsoft/native-background-geolocation.git", "state" : { - "revision" : "db90bd9d0cedf0bbab22b15f43cc1dda57e0c208", - "version" : "4.0.12" + "revision" : "11e8b71f855b6a50019e44846c98b1f0b2156404", + "version" : "4.0.22" } }, { @@ -149,8 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-log", "state" : { - "revision" : "b1fa4ef41fe21b13120c034854042d12c43f66b2", - "version" : "1.7.1" + "revision" : "bbd81b6725ae874c69e9b8c8804d462356b55523", + "version" : "1.10.1" } }, { From e0b92c97f756e40fe91c5460a194b4f82da9b4c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:09:50 +0000 Subject: [PATCH 096/235] Bump shared_preferences from 2.5.4 to 2.5.5 Bumps [shared_preferences](https://github.com/flutter/packages/tree/main/packages/shared_preferences) from 2.5.4 to 2.5.5. - [Commits](https://github.com/flutter/packages/commits/shared_preferences-v2.5.5/packages/shared_preferences) --- updated-dependencies: - dependency-name: shared_preferences dependency-version: 2.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 0a66d007..34c7a498 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -625,10 +625,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" + sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.5" shared_preferences_android: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index b470e664..de43dfc3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: sdk: flutter intl: any flutter_background_geolocation: ^5.0.5 - shared_preferences: ^2.5.4 + shared_preferences: ^2.5.5 firebase_core: ^4.6.0 firebase_messaging: ^16.1.3 firebase_analytics: ^12.2.0 From 166bf7a7a8cf991e5a0b273457d90027a5b9c913 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:23:33 +0000 Subject: [PATCH 097/235] Bump shared_preferences_android from 2.4.21 to 2.4.23 Bumps [shared_preferences_android](https://github.com/flutter/packages/tree/main/packages/shared_preferences) from 2.4.21 to 2.4.23. - [Commits](https://github.com/flutter/packages/commits/shared_preferences_android-v2.4.23/packages/shared_preferences) --- updated-dependencies: - dependency-name: shared_preferences_android dependency-version: 2.4.23 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 34c7a498..402e46b0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -633,10 +633,10 @@ packages: dependency: "direct main" description: name: shared_preferences_android - sha256: "8374d6200ab33ac99031a852eba4c8eb2170c4bf20778b3e2c9eccb45384fb41" + sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 url: "https://pub.dev" source: hosted - version: "2.4.21" + version: "2.4.23" shared_preferences_foundation: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index de43dfc3..e2ba7b43 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: firebase_crashlytics: ^5.1.0 quick_actions: ^1.1.0 rate_my_app: ^2.3.2 - shared_preferences_android: ^2.4.21 + shared_preferences_android: ^2.4.23 wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.2.0 flutter_secure_storage: ^10.0.0 From a0f5d4bc23047662f9b96d40cd449d120cc0d937 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 00:09:16 +0000 Subject: [PATCH 098/235] Bump flutter_background_geolocation from 5.0.5 to 5.0.7 Bumps [flutter_background_geolocation](https://github.com/transistorsoft/flutter_background_geolocation) from 5.0.5 to 5.0.7. - [Changelog](https://github.com/transistorsoft/flutter_background_geolocation/blob/master/CHANGELOG.md) - [Commits](https://github.com/transistorsoft/flutter_background_geolocation/compare/5.0.5...5.0.7) --- updated-dependencies: - dependency-name: flutter_background_geolocation dependency-version: 5.0.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 402e46b0..c0c4283f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -258,10 +258,10 @@ packages: dependency: "direct main" description: name: flutter_background_geolocation - sha256: "0cb799043d31d2747f09b9ad881e0814e42898e850b10cd72b406bd731a0a376" + sha256: eb777ed6e80709b37cec5acdde8756dd6fd6dfcbada5e978c99e5d4f89ecc019 url: "https://pub.dev" source: hosted - version: "5.0.5" + version: "5.0.7" flutter_launcher_icons: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index e2ba7b43..71d159bd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - flutter_background_geolocation: ^5.0.5 + flutter_background_geolocation: ^5.0.7 shared_preferences: ^2.5.5 firebase_core: ^4.6.0 firebase_messaging: ^16.1.3 From cc1669a2af1c642009d731f17b5439f88c35d336 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 31 Mar 2026 17:54:15 -0700 Subject: [PATCH 099/235] Add iOS shortcuts (fix #134) --- ios/Runner.xcodeproj/project.pbxproj | 4 +++ ios/Runner/AppIntents.swift | 54 ++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 ios/Runner/AppIntents.swift diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 4533c733..e9d1d942 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 86ABD4FD2DCDB6B60041010B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 86ABD4FC2DCDB6B60041010B /* PrivacyInfo.xcprivacy */; }; + 86EF7BA42F7CA35C00D432C4 /* AppIntents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86EF7BA32F7CA35C00D432C4 /* AppIntents.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -58,6 +59,7 @@ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 86ABD4FC2DCDB6B60041010B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 86C43E8F2E65265A0098728F /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 86EF7BA32F7CA35C00D432C4 /* AppIntents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIntents.swift; sourceTree = ""; }; 916E587BCD954F3AF975F0DD /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -141,6 +143,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 86EF7BA32F7CA35C00D432C4 /* AppIntents.swift */, 86C43E8F2E65265A0098728F /* Runner.entitlements */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, @@ -417,6 +420,7 @@ files = ( 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + 86EF7BA42F7CA35C00D432C4 /* AppIntents.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/Runner/AppIntents.swift b/ios/Runner/AppIntents.swift new file mode 100644 index 00000000..1a9e920b --- /dev/null +++ b/ios/Runner/AppIntents.swift @@ -0,0 +1,54 @@ +import AppIntents +import TSLocationManager + +@available(iOS 16.0, *) +struct StartTrackingIntent: AppIntent { + static var title: LocalizedStringResource = "Start Tracking" + static var description = IntentDescription("Start continuous location tracking") + static var openAppWhenRun: Bool = false + + func perform() async throws -> some IntentResult { + BackgroundGeolocation.sharedInstance().start() + return .result() + } +} + +@available(iOS 16.0, *) +struct StopTrackingIntent: AppIntent { + static var title: LocalizedStringResource = "Stop Tracking" + static var description = IntentDescription("Stop continuous location tracking") + static var openAppWhenRun: Bool = false + + func perform() async throws -> some IntentResult { + BackgroundGeolocation.sharedInstance().stop() + return .result() + } +} + +@available(iOS 16.0, *) +struct TraccarShortcuts: AppShortcutsProvider { + static var appShortcuts: [AppShortcut] { + AppShortcut( + intent: StartTrackingIntent(), + phrases: [ + "Start tracking in \(.applicationName)", + "Start location tracking in \(.applicationName)", + "Enable tracking in \(.applicationName)", + "Turn on tracking in \(.applicationName)", + ], + shortTitle: "Start Tracking", + systemImageName: "play.fill" + ) + AppShortcut( + intent: StopTrackingIntent(), + phrases: [ + "Stop tracking in \(.applicationName)", + "Stop location tracking in \(.applicationName)", + "Disable tracking in \(.applicationName)", + "Turn off tracking in \(.applicationName)", + ], + shortTitle: "Stop Tracking", + systemImageName: "stop.fill" + ) + } +} From 76de75dcf8ae21b1e59c355a883366b134a23271 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 1 Apr 2026 14:13:55 -0700 Subject: [PATCH 100/235] Enable start on boot for iOS --- lib/preferences.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/preferences.dart b/lib/preferences.dart index 44ff9d08..b690a858 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -83,7 +83,7 @@ class Preferences { app: bg.AppConfig( enableHeadless: Platform.isAndroid ? true : null, stopOnTerminate: false, - startOnBoot: Platform.isAndroid ? true : null, + startOnBoot: true, heartbeatInterval: heartbeatInterval > 0 ? heartbeatInterval.toDouble() : null, preventSuspend: Platform.isIOS ? (heartbeatInterval > 0) : null, backgroundPermissionRationale: Platform.isAndroid From bc6d1905694870cddce1f083b0ee82f441f10333 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 3 Apr 2026 10:40:53 -0700 Subject: [PATCH 101/235] Update dependencies --- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index fe0f70af..dde6e932 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -131,8 +131,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/transistorsoft/native-background-geolocation.git", "state" : { - "revision" : "11e8b71f855b6a50019e44846c98b1f0b2156404", - "version" : "4.0.22" + "revision" : "24c12412917fa9c04dcb95ef3eb2409fbcc7e3a6", + "version" : "4.0.31" } }, { From b7c57e083b59c5b4eed2e91ecceb3332f4470442 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 3 Apr 2026 20:56:11 -0700 Subject: [PATCH 102/235] Do not reset on launch --- lib/preferences.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/preferences.dart b/lib/preferences.dart index b690a858..d47a592a 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -63,6 +63,7 @@ class Preferences { final fastestLocationUpdateInterval = (instance.getInt(fastestInterval) ?? 30) * 1000; final heartbeatInterval = instance.getInt(heartbeat) ?? 0; return bg.Config( + reset: false, isMoving: true, geolocation: bg.GeoConfig( desiredAccuracy: switch (instance.getString(accuracy)) { From 3d82f3d951198f0a435d36f7045e3bdc967e0f3f Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 3 Apr 2026 20:59:26 -0700 Subject: [PATCH 103/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 71d159bd..a1d8fae5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 9.7.16+131 +version: 9.7.17+132 environment: sdk: ^3.7.2 From 37a3d57561206bd44ae17537672b60e3b20ccd96 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 3 Apr 2026 21:30:17 -0700 Subject: [PATCH 104/235] Set reset when needed --- lib/configuration_service.dart | 2 +- lib/geolocation_service.dart | 2 +- lib/preferences.dart | 5 ++--- lib/push_service.dart | 2 +- lib/settings_screen.dart | 8 ++++---- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/configuration_service.dart b/lib/configuration_service.dart index f69eee0f..572b0ad1 100644 --- a/lib/configuration_service.dart +++ b/lib/configuration_service.dart @@ -23,7 +23,7 @@ class ConfigurationService { await _applyBoolParameter(parameters, Preferences.buffer); await _applyBoolParameter(parameters, Preferences.wakelock); await _applyBoolParameter(parameters, Preferences.stopDetection); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig()); + await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); } static Future _applyStringParameter( diff --git a/lib/geolocation_service.dart b/lib/geolocation_service.dart index 574f4b78..9a76eb5a 100644 --- a/lib/geolocation_service.dart +++ b/lib/geolocation_service.dart @@ -12,7 +12,7 @@ import 'package:wakelock_partial_android/wakelock_partial_android.dart'; class GeolocationService { static Future init() async { - await bg.BackgroundGeolocation.ready(Preferences.geolocationConfig()); + await bg.BackgroundGeolocation.ready(Preferences.geolocationConfig(false)); if (Platform.isAndroid) { await bg.BackgroundGeolocation.registerHeadlessTask(headlessTask); } diff --git a/lib/preferences.dart b/lib/preferences.dart index d47a592a..6864432a 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -57,14 +57,13 @@ class Preferences { } } - static bg.Config geolocationConfig() { + static bg.Config geolocationConfig(bool reset) { final isHighestAccuracy = instance.getString(accuracy) == 'highest'; final locationUpdateInterval = (instance.getInt(interval) ?? 0) * 1000; final fastestLocationUpdateInterval = (instance.getInt(fastestInterval) ?? 30) * 1000; final heartbeatInterval = instance.getInt(heartbeat) ?? 0; return bg.Config( - reset: false, - isMoving: true, + reset: reset, geolocation: bg.GeoConfig( desiredAccuracy: switch (instance.getString(accuracy)) { 'highest' => Platform.isIOS ? bg.DesiredAccuracy.navigation : bg.DesiredAccuracy.high, diff --git a/lib/push_service.dart b/lib/push_service.dart index de8ff9f8..66508d5d 100644 --- a/lib/push_service.dart +++ b/lib/push_service.dart @@ -65,7 +65,7 @@ class PushService { Future pushServiceBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(); await Preferences.init(); - await bg.BackgroundGeolocation.ready(Preferences.geolocationConfig()); + await bg.BackgroundGeolocation.ready(Preferences.geolocationConfig(false)); FirebaseCrashlytics.instance.log('push_background_handler'); await PushService._onMessage(message); } diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index ccc8b1cc..c770ffdc 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -80,7 +80,7 @@ class _SettingsScreenState extends State { } else { await Preferences.instance.setString(key, result); } - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig()); + await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); setState(() {}); } } @@ -150,7 +150,7 @@ class _SettingsScreenState extends State { ); if (selectedAccuracy != null) { await Preferences.instance.setString(Preferences.accuracy, selectedAccuracy); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig()); + await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); setState(() {}); } }, @@ -200,7 +200,7 @@ class _SettingsScreenState extends State { value: Preferences.instance.getBool(Preferences.buffer) ?? true, onChanged: (value) async { await Preferences.instance.setBool(Preferences.buffer, value); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig()); + await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); setState(() {}); }, ), @@ -227,7 +227,7 @@ class _SettingsScreenState extends State { value: Preferences.instance.getBool(Preferences.stopDetection) ?? true, onChanged: (value) async { await Preferences.instance.setBool(Preferences.stopDetection, value); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig()); + await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); setState(() {}); }, ), From cd8a85a309970eec688c6c2847bb310ffaadba10 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 3 Apr 2026 21:30:38 -0700 Subject: [PATCH 105/235] Update build code --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index a1d8fae5..65586c55 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 9.7.17+132 +version: 9.7.17+133 environment: sdk: ^3.7.2 From d2b81a57f1501864670334d3e4fde9988cab57a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 00:10:54 +0000 Subject: [PATCH 106/235] Bump flutter_background_geolocation from 5.0.7 to 5.1.0 Bumps [flutter_background_geolocation](https://github.com/transistorsoft/flutter_background_geolocation) from 5.0.7 to 5.1.0. - [Changelog](https://github.com/transistorsoft/flutter_background_geolocation/blob/master/CHANGELOG.md) - [Commits](https://github.com/transistorsoft/flutter_background_geolocation/compare/5.0.7...5.1.0) --- updated-dependencies: - dependency-name: flutter_background_geolocation dependency-version: 5.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index c0c4283f..0d26325f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -258,10 +258,10 @@ packages: dependency: "direct main" description: name: flutter_background_geolocation - sha256: eb777ed6e80709b37cec5acdde8756dd6fd6dfcbada5e978c99e5d4f89ecc019 + sha256: "495ef22c40c9cbf85c370180a5fd8586700af032a3620f522744c99c745b8542" url: "https://pub.dev" source: hosted - version: "5.0.7" + version: "5.1.0" flutter_launcher_icons: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 65586c55..bcc5e586 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - flutter_background_geolocation: ^5.0.7 + flutter_background_geolocation: ^5.1.0 shared_preferences: ^2.5.5 firebase_core: ^4.6.0 firebase_messaging: ^16.1.3 From d66e80b1ace1b7efbb608f8859bef979c6a49b8e Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 7 Apr 2026 21:16:54 -0400 Subject: [PATCH 107/235] Remove logback workaround issue --- android/app/build.gradle.kts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 58fd4e74..deb797b1 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -69,11 +69,6 @@ android { } } -dependencies { - implementation("org.slf4j:slf4j-api:2.0.17") - implementation("com.github.tony19:logback-android:3.0.0") -} - flutter { source = "../.." } From 05c3fd5c78e325a0f01519d99dd084e240bd21ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 00:12:47 +0000 Subject: [PATCH 108/235] Bump flutter_background_geolocation from 5.1.0 to 5.1.1 Bumps [flutter_background_geolocation](https://github.com/transistorsoft/flutter_background_geolocation) from 5.1.0 to 5.1.1. - [Changelog](https://github.com/transistorsoft/flutter_background_geolocation/blob/master/CHANGELOG.md) - [Commits](https://github.com/transistorsoft/flutter_background_geolocation/compare/5.1.0...5.1.1) --- updated-dependencies: - dependency-name: flutter_background_geolocation dependency-version: 5.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 0d26325f..0b2c1f2c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -258,10 +258,10 @@ packages: dependency: "direct main" description: name: flutter_background_geolocation - sha256: "495ef22c40c9cbf85c370180a5fd8586700af032a3620f522744c99c745b8542" + sha256: "1f0fd38e665b632341e26d8ba8c1c0f8b1c3195d28dd9082802b21f3ff9ed6dc" url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.1.1" flutter_launcher_icons: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index bcc5e586..aac38b68 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - flutter_background_geolocation: ^5.1.0 + flutter_background_geolocation: ^5.1.1 shared_preferences: ^2.5.5 firebase_core: ^4.6.0 firebase_messaging: ^16.1.3 From dfb5081d2c10d47d667e92f47c9987e120d57ad7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:10:51 +0000 Subject: [PATCH 109/235] Bump firebase_core from 4.6.0 to 4.7.0 Bumps [firebase_core](https://github.com/firebase/flutterfire/tree/main/packages/firebase_core) from 4.6.0 to 4.7.0. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_core-v4.7.0/packages/firebase_core) --- updated-dependencies: - dependency-name: firebase_core dependency-version: 4.7.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 0b2c1f2c..3480cf8c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -189,10 +189,10 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: "2f988dab915efde3b3105268dbd69efce0e8570d767a218ccd914afd0c10c8cc" + sha256: d5a94b884dcb1e6d3430298e94bfe002238094cdfd5e29202d536ee2120f9158 url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "4.7.0" firebase_core_platform_interface: dependency: transitive description: @@ -205,10 +205,10 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: "1399ab1f0ac3b503d8a9be64a4c997fc066bbf33f701f42866e5569f26205ebe" + sha256: dc5096257cd67292d34d78ceeb90836f02a4be921b5f3934311a02bb2376118c url: "https://pub.dev" source: hosted - version: "3.5.1" + version: "3.6.0" firebase_crashlytics: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index aac38b68..77e253fa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: intl: any flutter_background_geolocation: ^5.1.1 shared_preferences: ^2.5.5 - firebase_core: ^4.6.0 + firebase_core: ^4.7.0 firebase_messaging: ^16.1.3 firebase_analytics: ^12.2.0 firebase_crashlytics: ^5.1.0 From c309b37027ca762937b98cfa0fdfdcee74416f73 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:15:05 +0000 Subject: [PATCH 110/235] Bump firebase_messaging from 16.1.3 to 16.2.0 Bumps [firebase_messaging](https://github.com/firebase/flutterfire/tree/main/packages/firebase_messaging) from 16.1.3 to 16.2.0. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_messaging-v16.2.0/packages/firebase_messaging) --- updated-dependencies: - dependency-name: firebase_messaging dependency-version: 16.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 16 ++++++++-------- pubspec.yaml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 3480cf8c..9c5c7649 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: f698de6eb8a0dd7a9a931bbfe13568e8b77e702eb2deb13dd83480c5373e7746 + sha256: bda3b7b55958bfd867addc40d067b4b11f7b8846d57671f5b5a6e7f9a56fe3ad url: "https://pub.dev" source: hosted - version: "1.3.68" + version: "1.3.69" app_links: dependency: "direct main" description: @@ -229,26 +229,26 @@ packages: dependency: "direct main" description: name: firebase_messaging - sha256: "8dc372085b1647f05e3ec1b8bc1dada87c0062f93b2a6976f620eb85edc44f97" + sha256: e5c93e8e7a9b0513f94bb684d2cf100e32e7dcdf2949574386b1955fc9a9b96a url: "https://pub.dev" source: hosted - version: "16.1.3" + version: "16.2.0" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "6ea10f7df747542b17679d5939213c09163aab9c301b2f9b858cb55f38efdb54" + sha256: "8cbb7d842e5071bba836452aff262f7db4b14bb3a0d00c1896cf176df886d65a" url: "https://pub.dev" source: hosted - version: "4.7.8" + version: "4.7.9" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "1f9798c8021ccf22b7e43e7fba81becd42252cb168228379fcabb7c2ef7dd638" + sha256: "8750bacf50573c0383535fc3f9c58c6a2f9dff5320a16a82c30631b9dad894f1" url: "https://pub.dev" source: hosted - version: "4.1.4" + version: "4.1.5" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 77e253fa..ad008f7c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: flutter_background_geolocation: ^5.1.1 shared_preferences: ^2.5.5 firebase_core: ^4.7.0 - firebase_messaging: ^16.1.3 + firebase_messaging: ^16.2.0 firebase_analytics: ^12.2.0 firebase_crashlytics: ^5.1.0 quick_actions: ^1.1.0 From 17b0451d3fe0525f09f146459583f7286f302c25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:20:09 +0000 Subject: [PATCH 111/235] Bump firebase_analytics from 12.2.0 to 12.3.0 Bumps [firebase_analytics](https://github.com/firebase/flutterfire/tree/main/packages/firebase_analytics) from 12.2.0 to 12.3.0. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_analytics-v12.3.0/packages/firebase_analytics) --- updated-dependencies: - dependency-name: firebase_analytics dependency-version: 12.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 12 ++++++------ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 9c5c7649..38a3b8c5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,26 +165,26 @@ packages: dependency: "direct main" description: name: firebase_analytics - sha256: e5679ed436d5554e230013287bbe993e41b97850e34972962d62140908e7b4ae + sha256: "6993e54441e96b4de1dd85a159b236bbcd2c2487215c9d02b12c1685ddfded73" url: "https://pub.dev" source: hosted - version: "12.2.0" + version: "12.3.0" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: "121e8c54c69f7c4da0b99fc616d513db130dd407c8720ddd8cb63b4adaab70e6" + sha256: ac2a17484daf380b2247b9874e675ff9e4ac611d839a10b91b7445f764756760 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.1.1" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: "0cabfa34f122858fde79719c88e49d76e16999df30d03d1601a457f25dfed7ab" + sha256: "167a3115e71501ba6706235f00e370072920ee8d26b44fbfb9dc8e63c98a8d9b" url: "https://pub.dev" source: hosted - version: "0.6.1+4" + version: "0.6.1+5" firebase_core: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index ad008f7c..2214aba2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: shared_preferences: ^2.5.5 firebase_core: ^4.7.0 firebase_messaging: ^16.2.0 - firebase_analytics: ^12.2.0 + firebase_analytics: ^12.3.0 firebase_crashlytics: ^5.1.0 quick_actions: ^1.1.0 rate_my_app: ^2.3.2 From 5b52919d8aa988c2e5b9c6148c2a9f14c3cbdd95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:29:42 +0000 Subject: [PATCH 112/235] Bump firebase_crashlytics from 5.1.0 to 5.2.0 Bumps [firebase_crashlytics](https://github.com/firebase/flutterfire/tree/main/packages/firebase_crashlytics) from 5.1.0 to 5.2.0. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_crashlytics-v5.2.0/packages/firebase_crashlytics) --- updated-dependencies: - dependency-name: firebase_crashlytics dependency-version: 5.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 38a3b8c5..1ae91931 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -213,18 +213,18 @@ packages: dependency: "direct main" description: name: firebase_crashlytics - sha256: "9f9831b4ca1282421f4387181bfb8e6c4ee82049e616e433272c4fd13dfd5484" + sha256: "43a311b280d9391389a690d10e1ac0d458b965154a57de5be2f0857225aa2016" url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.2.0" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: "310f6ecc2bb27e36025c6777bef9d2e7dd32562a7cae3d914ea88ad5a2d536e4" + sha256: "1b6a921ad6f0d08203ecc1310437a88cec357bc3cad27e1138f1e2c16dd71db9" url: "https://pub.dev" source: hosted - version: "3.8.19" + version: "3.8.20" firebase_messaging: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 2214aba2..7e6a53cc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: firebase_core: ^4.7.0 firebase_messaging: ^16.2.0 firebase_analytics: ^12.3.0 - firebase_crashlytics: ^5.1.0 + firebase_crashlytics: ^5.2.0 quick_actions: ^1.1.0 rate_my_app: ^2.3.2 shared_preferences_android: ^2.4.23 From 94f670fc3579cb420886f9734cac2bc95858de3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 00:49:03 +0000 Subject: [PATCH 113/235] Bump flutter_background_geolocation from 5.1.1 to 5.1.2 Bumps [flutter_background_geolocation](https://github.com/transistorsoft/flutter_background_geolocation) from 5.1.1 to 5.1.2. - [Changelog](https://github.com/transistorsoft/flutter_background_geolocation/blob/master/CHANGELOG.md) - [Commits](https://github.com/transistorsoft/flutter_background_geolocation/commits) --- updated-dependencies: - dependency-name: flutter_background_geolocation dependency-version: 5.1.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 1ae91931..f2462da2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -258,10 +258,10 @@ packages: dependency: "direct main" description: name: flutter_background_geolocation - sha256: "1f0fd38e665b632341e26d8ba8c1c0f8b1c3195d28dd9082802b21f3ff9ed6dc" + sha256: e680365eb3a7bff4f3e2027261ca86148e1505a939c3b9dd73d7d93669db7fdb url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "5.1.2" flutter_launcher_icons: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 7e6a53cc..9350538a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - flutter_background_geolocation: ^5.1.1 + flutter_background_geolocation: ^5.1.2 shared_preferences: ^2.5.5 firebase_core: ^4.7.0 firebase_messaging: ^16.2.0 From 561aadbc6243cfbf6ac44c2847e2a1d7b595c472 Mon Sep 17 00:00:00 2001 From: Traccar Bot Date: Tue, 21 Apr 2026 14:20:03 +0000 Subject: [PATCH 114/235] Update translations --- lib/l10n/app_pl.arb | 2 +- lib/l10n/app_zh_TW.arb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 253e743c..a9df5c23 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -33,5 +33,5 @@ "startAction": "Uruchom usługę", "stopAction": "Zatrzymaj usługę", "sosAction": "Wyślij SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "Ta aplikacja zbiera w tle dane dotyczące lokalizacji i aktywności i wysyła je na skonfigurowany serwer." } diff --git a/lib/l10n/app_zh_TW.arb b/lib/l10n/app_zh_TW.arb index 8b5916b4..ec6dadec 100644 --- a/lib/l10n/app_zh_TW.arb +++ b/lib/l10n/app_zh_TW.arb @@ -33,5 +33,5 @@ "startAction": "啟動服務", "stopAction": "停止服務", "sosAction": "發送SOS求救", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "該應用程式會在背景收集位置和活動數據,並將其傳送到配置的伺服器。" } From f9cce7667018f6fefaac471f197780dd3eee2a4f Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 21 Apr 2026 21:14:21 -0700 Subject: [PATCH 115/235] Update project files --- android/app/src/main/AndroidManifest.xml | 1 - .../org/traccar/client/MainApplication.kt | 11 - ios/Podfile.lock | 253 ++++++++++++++++++ ios/Runner.xcodeproj/project.pbxproj | 18 ++ .../xcshareddata/swiftpm/Package.resolved | 167 ------------ pubspec.lock | 60 ++++- pubspec.yaml | 2 +- 7 files changed, 318 insertions(+), 194 deletions(-) delete mode 100644 android/app/src/main/kotlin/org/traccar/client/MainApplication.kt delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 37f934c7..ee4dce04 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,7 +5,6 @@ 12.12.0) + - Firebase/Crashlytics (12.12.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 12.12.0) + - Firebase/Messaging (12.12.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 12.12.0) + - firebase_analytics (12.3.0): + - firebase_core + - FirebaseAnalytics (= 12.12.0) + - Flutter + - firebase_core (4.7.0): + - Firebase/CoreOnly (= 12.12.0) + - Flutter + - firebase_crashlytics (5.2.0): + - Firebase/Crashlytics (= 12.12.0) + - firebase_core + - Flutter + - firebase_messaging (16.2.0): + - Firebase/Messaging (= 12.12.0) + - firebase_core + - Flutter + - FirebaseAnalytics (12.12.0): + - FirebaseAnalytics/Default (= 12.12.0) + - FirebaseCore (~> 12.12.0) + - FirebaseInstallations (~> 12.12.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - FirebaseAnalytics/Default (12.12.0): + - FirebaseCore (~> 12.12.0) + - FirebaseInstallations (~> 12.12.0) + - GoogleAppMeasurement/Default (= 12.12.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - FirebaseCore (12.12.1): + - FirebaseCoreInternal (~> 12.12.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (12.12.0): + - FirebaseCore (~> 12.12.0) + - FirebaseCoreInternal (12.12.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseCrashlytics (12.12.1): + - FirebaseCore (~> 12.12.0) + - FirebaseInstallations (~> 12.12.0) + - FirebaseRemoteConfigInterop (~> 12.12.0) + - FirebaseSessions (~> 12.12.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/Environment (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - FirebaseInstallations (12.12.0): + - FirebaseCore (~> 12.12.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (12.12.0): + - FirebaseCore (~> 12.12.0) + - FirebaseInstallations (~> 12.12.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - FirebaseRemoteConfigInterop (12.12.0) + - FirebaseSessions (12.12.0): + - FirebaseCore (~> 12.12.0) + - FirebaseCoreExtension (~> 12.12.0) + - FirebaseInstallations (~> 12.12.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesSwift (~> 2.1) - Flutter (1.0.0) + - flutter_background_geolocation (5.1.2): + - Flutter + - TSLocationManager (~> 4.1.0) + - flutter_secure_storage_darwin (10.0.0): + - Flutter + - FlutterMacOS + - GoogleAdsOnDeviceConversion (3.4.2): + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/Core (12.12.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/Default (12.12.0): + - GoogleAdsOnDeviceConversion (~> 3.4.0) + - GoogleAppMeasurement/Core (= 12.12.0) + - GoogleAppMeasurement/IdentitySupport (= 12.12.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/IdentitySupport (12.12.0): + - GoogleAppMeasurement/Core (= 12.12.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/MethodSwizzler (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - mobile_scanner (7.0.0): + - Flutter + - FlutterMacOS + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - PromisesObjC (2.4.0) + - PromisesSwift (2.4.0): + - PromisesObjC (= 2.4.0) + - quick_actions_ios (0.0.1): + - Flutter - rate_my_app (2.3.2): - Flutter - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - TSBackgroundFetch (4.1.1) + - TSLocationManager (4.1.6): + - TSBackgroundFetch (~> 4.1.0) DEPENDENCIES: + - app_links (from `.symlinks/plugins/app_links/ios`) + - app_settings (from `.symlinks/plugins/app_settings/ios`) + - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) + - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - Flutter (from `Flutter`) + - flutter_background_geolocation (from `.symlinks/plugins/flutter_background_geolocation/ios`) + - flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`) + - mobile_scanner (from `.symlinks/plugins/mobile_scanner/darwin`) + - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`) - rate_my_app (from `.symlinks/plugins/rate_my_app/darwin`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + +SPEC REPOS: + trunk: + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseInstallations + - FirebaseMessaging + - FirebaseRemoteConfigInterop + - FirebaseSessions + - GoogleAdsOnDeviceConversion + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleUtilities + - nanopb + - PromisesObjC + - PromisesSwift + - TSBackgroundFetch + - TSLocationManager EXTERNAL SOURCES: + app_links: + :path: ".symlinks/plugins/app_links/ios" + app_settings: + :path: ".symlinks/plugins/app_settings/ios" + firebase_analytics: + :path: ".symlinks/plugins/firebase_analytics/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_crashlytics: + :path: ".symlinks/plugins/firebase_crashlytics/ios" + firebase_messaging: + :path: ".symlinks/plugins/firebase_messaging/ios" Flutter: :path: Flutter + flutter_background_geolocation: + :path: ".symlinks/plugins/flutter_background_geolocation/ios" + flutter_secure_storage_darwin: + :path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin" + mobile_scanner: + :path: ".symlinks/plugins/mobile_scanner/darwin" + quick_actions_ios: + :path: ".symlinks/plugins/quick_actions_ios/ios" rate_my_app: :path: ".symlinks/plugins/rate_my_app/darwin" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" SPEC CHECKSUMS: + app_links: a754cbec3c255bd4bbb4d236ecc06f28cd9a7ce8 + app_settings: 0341ec6daa4f0c50f5a421bf0ad7c36084db6e90 + Firebase: aa154fee4e9b8eac17aa42344988865b3e857d33 + firebase_analytics: e5f4faccf1f7040d3788e835b7eb7b57dc84a911 + firebase_core: 9156a152117c843440b0b990c785aa0259bc5447 + firebase_crashlytics: e24acd48861c5edf6e0f6c134d6a0b28593c76d7 + firebase_messaging: 0d962ab44ff24ed36deb8fa2ee043c4671858269 + FirebaseAnalytics: db0dca7e35a503ddf6869e457f4926dc35afe216 + FirebaseCore: 86241206e656f5c80c995e370e6c975913b9b284 + FirebaseCoreExtension: ff6fd42eb5287e71d3e160450de6509733d9ead7 + FirebaseCoreInternal: 7c12fc3011d889085e765e317d7b9fd1cef97af9 + FirebaseCrashlytics: 03f4e20d0c9b7fd6338cb9066f4bfb69d3f42fd0 + FirebaseInstallations: 4e6e162aa4abaaeeeb01dd00179dfc5ad9c2194e + FirebaseMessaging: 341004946fa7ffc741344b20f1b667514fc93e31 + FirebaseRemoteConfigInterop: 23996ab7397494722df4fdd1fd398024389d5da8 + FirebaseSessions: 804bd321f2d2f2ddafe74ef7856062aa19f179c2 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + flutter_background_geolocation: 1e75dac050fd6dd7c59c497edf7aa755dfde3eb7 + flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23 + GoogleAdsOnDeviceConversion: 02fc8fe599acd867e328321effb0d9b2d023a38a + GoogleAppMeasurement: 3b4687de50ab25ee2d4d541849f10ca8df862a12 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93 + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 + quick_actions_ios: 500fcc11711d9f646739093395c4ae8eec25f779 rate_my_app: cbb89973f870601f80f7bad63aba107260cabc5b + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb + TSBackgroundFetch: 18918b6449a1e3f01eb0f5b44d6d79ce6160a5a5 + TSLocationManager: 7dd12e7e98191abc74327a017560c4eced17a83d PODFILE CHECKSUM: ce2a4dd764e1c7aeed6a7cdc5e61d092b6dc6d32 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index e9d1d942..90c20c6e 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -214,6 +214,7 @@ 3B06AD1E1E4923F5004D2608 /* Thin Binary */, B103AE670B136CF320D263A0 /* [CP] Embed Pods Frameworks */, 8D2D9F72CCBD33BB3AF0B2DE /* FlutterFire: "flutterfire upload-crashlytics-symbols" */, + A9B1079A9392DD8285EE1EF9 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -364,6 +365,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + A9B1079A9392DD8285EE1EF9 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; AAF19D00E31B31B06E129F93 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index dde6e932..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,167 +0,0 @@ -{ - "pins" : [ - { - "identity" : "abseil-cpp-binary", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/abseil-cpp-binary.git", - "state" : { - "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5", - "version" : "1.2024072200.0" - } - }, - { - "identity" : "app-check", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/app-check.git", - "state" : { - "revision" : "61b85103a1aeed8218f17c794687781505fbbef5", - "version" : "11.2.0" - } - }, - { - "identity" : "cocoalumberjack", - "kind" : "remoteSourceControl", - "location" : "https://github.com/CocoaLumberjack/CocoaLumberjack.git", - "state" : { - "revision" : "a9ed4b6f9bdedce7d77046f43adfb8ce1fd54114", - "version" : "3.9.0" - } - }, - { - "identity" : "firebase-ios-sdk", - "kind" : "remoteSourceControl", - "location" : "https://github.com/firebase/firebase-ios-sdk", - "state" : { - "revision" : "52548902007e7beda99fcdca31f62eccc4befe38", - "version" : "12.11.0" - } - }, - { - "identity" : "flutterfire", - "kind" : "remoteSourceControl", - "location" : "https://github.com/firebase/flutterfire", - "state" : { - "revision" : "a10a4148e769fadb01b1ff8d6bb76e9137f35b81", - "version" : "4.6.0-firebase-core-swift" - } - }, - { - "identity" : "google-ads-on-device-conversion-ios-sdk", - "kind" : "remoteSourceControl", - "location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk", - "state" : { - "revision" : "7b722132d1f2ab421c88a2e5c384c984cebd0d00", - "version" : "3.4.0" - } - }, - { - "identity" : "googleappmeasurement", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/GoogleAppMeasurement.git", - "state" : { - "revision" : "1657f705bc70255ff9d66dfcc697a85db164998f", - "version" : "12.11.0" - } - }, - { - "identity" : "googledatatransport", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/GoogleDataTransport.git", - "state" : { - "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", - "version" : "10.1.0" - } - }, - { - "identity" : "googleutilities", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/GoogleUtilities.git", - "state" : { - "revision" : "60da361632d0de02786f709bdc0c4df340f7613e", - "version" : "8.1.0" - } - }, - { - "identity" : "grpc-binary", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/grpc-binary.git", - "state" : { - "revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6", - "version" : "1.69.1" - } - }, - { - "identity" : "gtm-session-fetcher", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/gtm-session-fetcher.git", - "state" : { - "revision" : "0be208810d2e8b90fcd2464d1816723b47819fe7", - "version" : "5.2.0" - } - }, - { - "identity" : "interop-ios-for-google-sdks", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/interop-ios-for-google-sdks.git", - "state" : { - "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe", - "version" : "101.0.0" - } - }, - { - "identity" : "leveldb", - "kind" : "remoteSourceControl", - "location" : "https://github.com/firebase/leveldb.git", - "state" : { - "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", - "version" : "1.22.5" - } - }, - { - "identity" : "nanopb", - "kind" : "remoteSourceControl", - "location" : "https://github.com/firebase/nanopb.git", - "state" : { - "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", - "version" : "2.30910.0" - } - }, - { - "identity" : "native-background-geolocation", - "kind" : "remoteSourceControl", - "location" : "https://github.com/transistorsoft/native-background-geolocation.git", - "state" : { - "revision" : "24c12412917fa9c04dcb95ef3eb2409fbcc7e3a6", - "version" : "4.0.31" - } - }, - { - "identity" : "promises", - "kind" : "remoteSourceControl", - "location" : "https://github.com/google/promises.git", - "state" : { - "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", - "version" : "2.4.0" - } - }, - { - "identity" : "swift-log", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-log", - "state" : { - "revision" : "bbd81b6725ae874c69e9b8c8804d462356b55523", - "version" : "1.10.1" - } - }, - { - "identity" : "transistor-background-fetch", - "kind" : "remoteSourceControl", - "location" : "https://github.com/transistorsoft/transistor-background-fetch.git", - "state" : { - "revision" : "ba64a5ca902b36601a0c8a9a46d5510cf7a63c1c", - "version" : "4.0.6" - } - } - ], - "version" : 2 -} diff --git a/pubspec.lock b/pubspec.lock index f2462da2..ab2d8c73 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -69,10 +69,10 @@ packages: dependency: transitive description: name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.13.1" boolean_selector: dependency: transitive description: @@ -369,10 +369,10 @@ packages: dependency: transitive description: name: hooks - sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388 + sha256: "025f060e86d2d4c3c47b56e33caf7f93bf9283340f26d23424ebcfccf34f621e" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" image: dependency: transitive description: @@ -389,6 +389,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.2" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" json_annotation: dependency: transitive description: @@ -485,6 +501,14 @@ packages: url: "https://pub.dev" source: hosted version: "9.3.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" path: dependency: transitive description: @@ -505,10 +529,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" url: "https://pub.dev" source: hosted - version: "2.2.22" + version: "2.3.1" path_provider_foundation: dependency: transitive description: @@ -593,18 +617,18 @@ packages: dependency: transitive description: name: quick_actions_android - sha256: "23f04632ada7fc16665d84ba54a0c792c09727e7fda6c989c6e6ba1853aa15dc" + sha256: "8e491323342fa68420ca26a9bd5a2bbcdb526bda33db45b6427c6d139fb7316d" url: "https://pub.dev" source: hosted - version: "1.0.27" + version: "1.0.29" quick_actions_ios: dependency: transitive description: name: quick_actions_ios - sha256: a2e08ceb01f9d26e1b1826b1c4f5da6b7b6bbf61bcbaacd8e93dfff58b91f996 + sha256: be1496e7ca1debc86d9ea08e56325649fbc5abb2b6930690c97ba0dae59992b1 url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.2.4" quick_actions_platform_interface: dependency: transitive description: @@ -621,6 +645,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" shared_preferences: dependency: "direct main" description: @@ -657,10 +689,10 @@ packages: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" shared_preferences_web: dependency: transitive description: @@ -750,10 +782,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" url: "https://pub.dev" source: hosted - version: "15.0.2" + version: "15.1.0" wakelock_partial_android: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 9350538a..55806e31 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 9.7.17+133 +version: 9.7.18+134 environment: sdk: ^3.7.2 From 8ae133752709e3de670249776da481c36399c44b Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 21 Apr 2026 21:15:06 -0700 Subject: [PATCH 116/235] Update version code --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 55806e31..eb9a6017 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 9.7.18+134 +version: 9.7.18+135 environment: sdk: ^3.7.2 From 0658a95ddbdcafed739d4c6589225ae90fcf4a73 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 00:13:19 +0000 Subject: [PATCH 117/235] Bump rate_my_app from 2.3.2 to 2.4.0 Bumps [rate_my_app](https://github.com/Skyost/RateMyApp) from 2.3.2 to 2.4.0. - [Changelog](https://github.com/Skyost/RateMyApp/blob/master/CHANGELOG.md) - [Commits](https://github.com/Skyost/RateMyApp/commits) --- updated-dependencies: - dependency-name: rate_my_app dependency-version: 2.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index ab2d8c73..a4cb3b28 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -641,10 +641,10 @@ packages: dependency: "direct main" description: name: rate_my_app - sha256: aeb400808f99aba7e8b853b911915bca10308aff711fa8e2d46b5f68dc383786 + sha256: "910f6fbe6c070a204dc0595f876352621203a4829d72fc2771c3a1f443132721" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" record_use: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index eb9a6017..f01f102f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: firebase_analytics: ^12.3.0 firebase_crashlytics: ^5.2.0 quick_actions: ^1.1.0 - rate_my_app: ^2.3.2 + rate_my_app: ^2.4.0 shared_preferences_android: ^2.4.23 wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.2.0 From 02c7f62c5eee4561fb5bb7e70703af0b3f5c9450 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 00:11:55 +0000 Subject: [PATCH 118/235] Bump flutter_secure_storage from 10.0.0 to 10.1.0 Bumps [flutter_secure_storage](https://github.com/mogol/flutter_secure_storage) from 10.0.0 to 10.1.0. - [Release notes](https://github.com/mogol/flutter_secure_storage/releases) - [Commits](https://github.com/mogol/flutter_secure_storage/compare/v10.0.0...v10.1.0) --- updated-dependencies: - dependency-name: flutter_secure_storage dependency-version: 10.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 12 ++++++------ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index a4cb3b28..ea92e5bb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -295,18 +295,18 @@ packages: dependency: "direct main" description: name: flutter_secure_storage - sha256: da922f2aab2d733db7e011a6bcc4a825b844892d4edd6df83ff156b09a9b2e40 + sha256: "8b302d17096ba88f911b7eb317c71d5e691da60a259549f42b38c658d1776d87" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.1.0" flutter_secure_storage_darwin: dependency: transitive description: name: flutter_secure_storage_darwin - sha256: "8878c25136a79def1668c75985e8e193d9d7d095453ec28730da0315dc69aee3" + sha256: "3af15a3cb2bf5b8b776832bd01776f8018766aece55623176e28b406481fb320" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.3.0" flutter_secure_storage_linux: dependency: transitive description: @@ -327,10 +327,10 @@ packages: dependency: transitive description: name: flutter_secure_storage_web - sha256: "6a1137df62b84b54261dca582c1c09ea72f4f9a4b2fcee21b025964132d5d0c3" + sha256: "073a62b3aeb866ab4ce795f960413948e51e5a42a9b0c8333b6daf5bb3208a1c" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" flutter_secure_storage_windows: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f01f102f..39dd2dd8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: shared_preferences_android: ^2.4.23 wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.2.0 - flutter_secure_storage: ^10.0.0 + flutter_secure_storage: ^10.1.0 app_links: ^7.0.0 app_settings: ^7.0.0 From 100291418e77708c65851b0f8c928e355613dd5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 05:55:52 +0000 Subject: [PATCH 119/235] Bump firebase_core from 4.7.0 to 4.8.0 Bumps [firebase_core](https://github.com/firebase/flutterfire/tree/main/packages/firebase_core) from 4.7.0 to 4.8.0. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_core-v4.8.0/packages/firebase_core) --- updated-dependencies: - dependency-name: firebase_core dependency-version: 4.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 48 ++++++++++++++++++++++++------------------------ pubspec.yaml | 2 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index ea92e5bb..f8d8c922 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: bda3b7b55958bfd867addc40d067b4b11f7b8846d57671f5b5a6e7f9a56fe3ad + sha256: cc2ad182e5b3929a1a87a8eaf35413d8bb4baa4efec124bab3e538096cdbff0d url: "https://pub.dev" source: hosted - version: "1.3.69" + version: "1.3.70" app_links: dependency: "direct main" description: @@ -165,90 +165,90 @@ packages: dependency: "direct main" description: name: firebase_analytics - sha256: "6993e54441e96b4de1dd85a159b236bbcd2c2487215c9d02b12c1685ddfded73" + sha256: c0bd7c2cd62dfaa11473cba23046c56f708d12f76dbc7ea6850975f19acace07 url: "https://pub.dev" source: hosted - version: "12.3.0" + version: "12.4.0" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: ac2a17484daf380b2247b9874e675ff9e4ac611d839a10b91b7445f764756760 + sha256: "35786263e413b2eb066b3c06a00ea7982cf381562aac84de70e204af4671953e" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.0.0" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: "167a3115e71501ba6706235f00e370072920ee8d26b44fbfb9dc8e63c98a8d9b" + sha256: "31c216fa2ceda1fa9596e4f2cf601c5372417c86d42b4da881ab4fe9af4eadcd" url: "https://pub.dev" source: hosted - version: "0.6.1+5" + version: "0.6.1+6" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: d5a94b884dcb1e6d3430298e94bfe002238094cdfd5e29202d536ee2120f9158 + sha256: "15bf6f85a6c8cf786344b2f163350428fc4bce105bc5332d42fb951d90b7664e" url: "https://pub.dev" source: hosted - version: "4.7.0" + version: "4.8.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: "0ecda14c1bfc9ed8cac303dd0f8d04a320811b479362a9a4efb14fd331a473ce" + sha256: "7aafd426ad1926cfb1a7e9e012df5eff7d9a55200b31b04bc65ef45329ea5dee" url: "https://pub.dev" source: hosted - version: "6.0.3" + version: "7.0.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: dc5096257cd67292d34d78ceeb90836f02a4be921b5f3934311a02bb2376118c + sha256: "73b01cba93a4f673596a7664f8265eb538f007a84a8f5880359db8ff76c3471b" url: "https://pub.dev" source: hosted - version: "3.6.0" + version: "3.6.1" firebase_crashlytics: dependency: "direct main" description: name: firebase_crashlytics - sha256: "43a311b280d9391389a690d10e1ac0d458b965154a57de5be2f0857225aa2016" + sha256: "4bde2b2837062ccd84b7f8e5696cb96fe6e3d1f4eb60bd6091406f2fbdb52999" url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "5.2.1" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: "1b6a921ad6f0d08203ecc1310437a88cec357bc3cad27e1138f1e2c16dd71db9" + sha256: ce98d3d68a9d02b314911e5b9b2aa02fd9320cec3f863744ddc56555b0d5945b url: "https://pub.dev" source: hosted - version: "3.8.20" + version: "3.8.21" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: e5c93e8e7a9b0513f94bb684d2cf100e32e7dcdf2949574386b1955fc9a9b96a + sha256: "4ebb881070b40038d61799cff914b18a44649e2e47ab444fc32055c3d6bf2df0" url: "https://pub.dev" source: hosted - version: "16.2.0" + version: "16.2.1" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "8cbb7d842e5071bba836452aff262f7db4b14bb3a0d00c1896cf176df886d65a" + sha256: "50eb5e125ec38b4b0b900c9f096ec94f2eeb4243d5668604f1dea24340bdb428" url: "https://pub.dev" source: hosted - version: "4.7.9" + version: "4.7.10" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "8750bacf50573c0383535fc3f9c58c6a2f9dff5320a16a82c30631b9dad894f1" + sha256: "1dfd311e764ac42be99a0aa8d9d5f7602774085af4f873658769f1438f8af918" url: "https://pub.dev" source: hosted - version: "4.1.5" + version: "4.1.6" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 39dd2dd8..86789ada 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: intl: any flutter_background_geolocation: ^5.1.2 shared_preferences: ^2.5.5 - firebase_core: ^4.7.0 + firebase_core: ^4.8.0 firebase_messaging: ^16.2.0 firebase_analytics: ^12.3.0 firebase_crashlytics: ^5.2.0 From c0fd7970bd5cd917df35d838b9c930f70934893f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 05:56:16 +0000 Subject: [PATCH 120/235] Bump flutter_secure_storage from 10.1.0 to 10.2.0 Bumps [flutter_secure_storage](https://github.com/mogol/flutter_secure_storage) from 10.1.0 to 10.2.0. - [Release notes](https://github.com/mogol/flutter_secure_storage/releases) - [Commits](https://github.com/mogol/flutter_secure_storage/compare/v10.1.0...v10.2.0) --- updated-dependencies: - dependency-name: flutter_secure_storage dependency-version: 10.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index ea92e5bb..c670b320 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -295,10 +295,10 @@ packages: dependency: "direct main" description: name: flutter_secure_storage - sha256: "8b302d17096ba88f911b7eb317c71d5e691da60a259549f42b38c658d1776d87" + sha256: "6848263f9744072d0977347c383fb8b57d9780319a6bf5238b5a2866a029de62" url: "https://pub.dev" source: hosted - version: "10.1.0" + version: "10.2.0" flutter_secure_storage_darwin: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 39dd2dd8..241ae062 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: shared_preferences_android: ^2.4.23 wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.2.0 - flutter_secure_storage: ^10.1.0 + flutter_secure_storage: ^10.2.0 app_links: ^7.0.0 app_settings: ^7.0.0 From dcd8ee4cc53a043e98371c187ca21f5cd1495714 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 00:15:08 +0000 Subject: [PATCH 121/235] Bump firebase_core from 4.8.0 to 4.9.0 Bumps [firebase_core](https://github.com/firebase/flutterfire/tree/main/packages/firebase_core) from 4.8.0 to 4.9.0. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_core-v4.9.0/packages/firebase_core) --- updated-dependencies: - dependency-name: firebase_core dependency-version: 4.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 12 ++++++------ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index cd36f7b0..afa958ec 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -189,26 +189,26 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: "15bf6f85a6c8cf786344b2f163350428fc4bce105bc5332d42fb951d90b7664e" + sha256: "93a5bde9775fd5adcc937f39dfa04ae0bc89c4d79bea6abc49de3f7b049d9ff6" url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "4.9.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: "7aafd426ad1926cfb1a7e9e012df5eff7d9a55200b31b04bc65ef45329ea5dee" + sha256: "4a120366dbf7d5a8ee9438978530b664b855728fb8dcc3a201017660817e555b" url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "73b01cba93a4f673596a7664f8265eb538f007a84a8f5880359db8ff76c3471b" + sha256: "7c98f10b8c8e5adedc0b810b66a877120696675e2c22d9ca9caca092da0d9e57" url: "https://pub.dev" source: hosted - version: "3.6.1" + version: "3.7.0" firebase_crashlytics: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index d9dc783d..8587ce20 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: intl: any flutter_background_geolocation: ^5.1.2 shared_preferences: ^2.5.5 - firebase_core: ^4.8.0 + firebase_core: ^4.9.0 firebase_messaging: ^16.2.0 firebase_analytics: ^12.3.0 firebase_crashlytics: ^5.2.0 From c9f5d8b5d7acf9d8ea9cdc4240f9232c62796f0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 00:15:11 +0000 Subject: [PATCH 122/235] Bump flutter_background_geolocation from 5.1.2 to 5.2.0 Bumps [flutter_background_geolocation](https://github.com/transistorsoft/flutter_background_geolocation) from 5.1.2 to 5.2.0. - [Changelog](https://github.com/transistorsoft/flutter_background_geolocation/blob/master/CHANGELOG.md) - [Commits](https://github.com/transistorsoft/flutter_background_geolocation/commits) --- updated-dependencies: - dependency-name: flutter_background_geolocation dependency-version: 5.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index cd36f7b0..d3f86693 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -258,10 +258,10 @@ packages: dependency: "direct main" description: name: flutter_background_geolocation - sha256: e680365eb3a7bff4f3e2027261ca86148e1505a939c3b9dd73d7d93669db7fdb + sha256: "5281a0ca75b603dfd5557cb4a24c2f79b991591cbc73bd4da504a03a129b4344" url: "https://pub.dev" source: hosted - version: "5.1.2" + version: "5.2.0" flutter_launcher_icons: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index d9dc783d..54e09d18 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - flutter_background_geolocation: ^5.1.2 + flutter_background_geolocation: ^5.2.0 shared_preferences: ^2.5.5 firebase_core: ^4.8.0 firebase_messaging: ^16.2.0 From 45423209d0db09e0af72c61f786df2b116fd19aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 00:21:35 +0000 Subject: [PATCH 123/235] Bump firebase_messaging from 16.2.1 to 16.2.2 Bumps [firebase_messaging](https://github.com/firebase/flutterfire/tree/main/packages/firebase_messaging) from 16.2.1 to 16.2.2. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_messaging-v16.2.2/packages/firebase_messaging) --- updated-dependencies: - dependency-name: firebase_messaging dependency-version: 16.2.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 16 ++++++++-------- pubspec.yaml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index b1993e9f..608295b1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: cc2ad182e5b3929a1a87a8eaf35413d8bb4baa4efec124bab3e538096cdbff0d + sha256: "8f89e371e2883de35cdc78f648e725fa4da5f3b6c927269f00fa68f1ea92b598" url: "https://pub.dev" source: hosted - version: "1.3.70" + version: "1.3.71" app_links: dependency: "direct main" description: @@ -229,26 +229,26 @@ packages: dependency: "direct main" description: name: firebase_messaging - sha256: "4ebb881070b40038d61799cff914b18a44649e2e47ab444fc32055c3d6bf2df0" + sha256: "8d0dc81a31cd030170508dc3e89bfd14355b20a1b991340af5f018e37daab5d7" url: "https://pub.dev" source: hosted - version: "16.2.1" + version: "16.2.2" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "50eb5e125ec38b4b0b900c9f096ec94f2eeb4243d5668604f1dea24340bdb428" + sha256: "37abb0b0535c5497605ee94c12470e1ebbbe47e71a22d0c20bffcc912311f8cb" url: "https://pub.dev" source: hosted - version: "4.7.10" + version: "4.7.11" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "1dfd311e764ac42be99a0aa8d9d5f7602774085af4f873658769f1438f8af918" + sha256: "54e22b43e2c26a2728a3f68c188de0f9011993ae19ae959a06d476dad935c776" url: "https://pub.dev" source: hosted - version: "4.1.6" + version: "4.1.7" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 458bcaa9..552516bb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: flutter_background_geolocation: ^5.2.0 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 - firebase_messaging: ^16.2.0 + firebase_messaging: ^16.2.2 firebase_analytics: ^12.3.0 firebase_crashlytics: ^5.2.0 quick_actions: ^1.1.0 From f888a1d9eed2a625eddcc584b62cda0a230f13ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 00:26:43 +0000 Subject: [PATCH 124/235] Bump firebase_crashlytics from 5.2.1 to 5.2.2 Bumps [firebase_crashlytics](https://github.com/firebase/flutterfire/tree/main/packages/firebase_crashlytics) from 5.2.1 to 5.2.2. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_crashlytics-v5.2.2/packages/firebase_crashlytics) --- updated-dependencies: - dependency-name: firebase_crashlytics dependency-version: 5.2.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 608295b1..96ca3cbc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -213,18 +213,18 @@ packages: dependency: "direct main" description: name: firebase_crashlytics - sha256: "4bde2b2837062ccd84b7f8e5696cb96fe6e3d1f4eb60bd6091406f2fbdb52999" + sha256: "9935ea36aaae0dfc789b80a1981fd70c6c7e9956791e9e7c2210ab83f9c963bd" url: "https://pub.dev" source: hosted - version: "5.2.1" + version: "5.2.2" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: ce98d3d68a9d02b314911e5b9b2aa02fd9320cec3f863744ddc56555b0d5945b + sha256: ade20d7d86698ded596bf16ab0e7060ef1dae9258ab6705536a39ae047ccef59 url: "https://pub.dev" source: hosted - version: "3.8.21" + version: "3.8.22" firebase_messaging: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 552516bb..3dd0b012 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 firebase_analytics: ^12.3.0 - firebase_crashlytics: ^5.2.0 + firebase_crashlytics: ^5.2.2 quick_actions: ^1.1.0 rate_my_app: ^2.4.0 shared_preferences_android: ^2.4.23 From b2c8b422160bcda3c87d786a582d97507a0e58c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 00:37:10 +0000 Subject: [PATCH 125/235] Bump firebase_analytics from 12.4.0 to 12.4.1 Bumps [firebase_analytics](https://github.com/firebase/flutterfire/tree/main/packages/firebase_analytics) from 12.4.0 to 12.4.1. - [Release notes](https://github.com/firebase/flutterfire/releases) - [Commits](https://github.com/firebase/flutterfire/commits/firebase_analytics-v12.4.1/packages/firebase_analytics) --- updated-dependencies: - dependency-name: firebase_analytics dependency-version: 12.4.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 12 ++++++------ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 96ca3cbc..d9ee66b6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,26 +165,26 @@ packages: dependency: "direct main" description: name: firebase_analytics - sha256: c0bd7c2cd62dfaa11473cba23046c56f708d12f76dbc7ea6850975f19acace07 + sha256: "56641bc6dd7b6a8c63ad5f5d46664af5b66db452f1c5ad052b1eec0188cf3183" url: "https://pub.dev" source: hosted - version: "12.4.0" + version: "12.4.1" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: "35786263e413b2eb066b3c06a00ea7982cf381562aac84de70e204af4671953e" + sha256: "432492ba57024a35dfb67ebcf0c64bac31e19d2c46b3dd222bccbc05f8839efe" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.0.1" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: "31c216fa2ceda1fa9596e4f2cf601c5372417c86d42b4da881ab4fe9af4eadcd" + sha256: e613fca6511ab8f13adb355f7bc486c49fa6aea72fb6703cfb34df29b3b568a6 url: "https://pub.dev" source: hosted - version: "0.6.1+6" + version: "0.6.1+7" firebase_core: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 3dd0b012..11752b72 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 - firebase_analytics: ^12.3.0 + firebase_analytics: ^12.4.1 firebase_crashlytics: ^5.2.2 quick_actions: ^1.1.0 rate_my_app: ^2.4.0 From b19dbc4e98e94a4e895278bfc3444b3bf1f03175 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 14:34:48 -0700 Subject: [PATCH 126/235] All release workflow --- .github/workflows/release.yml | 221 ++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..74860069 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,221 @@ +name: Release + +on: + push: + tags: ['v*'] + +env: + APPLE_TEAM_ID: YW49KTJKFW + IOS_BUNDLE_ID: org.traccar.client.TraccarClient + +jobs: + build-android: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: 17 + + - uses: subosito/flutter-action@v2 + with: + channel: stable + cache: true + + - name: Prepare keystore + key.properties + env: + KEYSTORE_BASE64: ${{ secrets.RELEASE_KEYSTORE_BASE64 }} + STORE_PASSWORD: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }} + KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }} + KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }} + run: | + mkdir -p "$RUNNER_WORKSPACE/environment" + echo "$KEYSTORE_BASE64" | base64 -d > "$RUNNER_WORKSPACE/environment/android.keystore" + cat > "$RUNNER_WORKSPACE/environment/key.properties" < /dev/null || { echo "App process not running after launch — crashed."; exit 1; } + + - uses: actions/upload-artifact@v4 + with: + name: launch-screenshot + path: launch.png + if-no-files-found: error + + publish-android: + needs: smoke-test-android + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: android-apk + path: apk + + - name: Upload to Google Play (production) + uses: r0adkll/upload-google-play@v1 + with: + serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }} + packageName: org.traccar.client + releaseFiles: apk/app-release.apk + track: production + status: completed + + build-ios: + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + + - uses: subosito/flutter-action@v2 + with: + channel: stable + cache: true + + - name: Import signing certificate into temp keychain + env: + CERT_P12_BASE64: ${{ secrets.IOS_DIST_CERT_P12_BASE64 }} + CERT_PASSWORD: ${{ secrets.IOS_DIST_CERT_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ secrets.IOS_KEYCHAIN_PASSWORD }} + run: | + KEYCHAIN_PATH="$RUNNER_TEMP/build.keychain-db" + echo "$CERT_P12_BASE64" | base64 -d > "$RUNNER_TEMP/cert.p12" + security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH" + security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security import "$RUNNER_TEMP/cert.p12" -P "$CERT_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH" + security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security list-keychain -d user -s "$KEYCHAIN_PATH" $(security list-keychains -d user | tr -d '"') + + - name: Install App Store Connect API key + env: + ASC_API_KEY_BASE64: ${{ secrets.ASC_API_KEY_BASE64 }} + ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} + run: | + mkdir -p ~/.appstoreconnect/private_keys + echo "$ASC_API_KEY_BASE64" | base64 -d > "$HOME/.appstoreconnect/private_keys/AuthKey_${ASC_KEY_ID}.p8" + + - name: Write ExportOptions.plist + run: | + cat > ios/ExportOptions.plist < + + + + method + app-store + teamID + ${APPLE_TEAM_ID} + signingStyle + automatic + uploadSymbols + + destination + upload + + + EOF + + - name: Archive and export IPA + env: + ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} + ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} + run: | + flutter pub get + flutter build ios --release --no-codesign + ARCHIVE_PATH="$RUNNER_TEMP/Runner.xcarchive" + EXPORT_PATH="$RUNNER_TEMP/ipa" + API_KEY_PATH="$HOME/.appstoreconnect/private_keys/AuthKey_${ASC_KEY_ID}.p8" + cd ios + xcodebuild \ + -workspace Runner.xcworkspace \ + -scheme Runner \ + -configuration Release \ + -archivePath "$ARCHIVE_PATH" \ + -allowProvisioningUpdates \ + -authenticationKeyPath "$API_KEY_PATH" \ + -authenticationKeyID "$ASC_KEY_ID" \ + -authenticationKeyIssuerID "$ASC_ISSUER_ID" \ + archive + xcodebuild \ + -exportArchive \ + -archivePath "$ARCHIVE_PATH" \ + -exportPath "$EXPORT_PATH" \ + -exportOptionsPlist ExportOptions.plist \ + -allowProvisioningUpdates \ + -authenticationKeyPath "$API_KEY_PATH" \ + -authenticationKeyID "$ASC_KEY_ID" \ + -authenticationKeyIssuerID "$ASC_ISSUER_ID" + + - uses: actions/upload-artifact@v4 + with: + name: ios-ipa + path: ${{ runner.temp }}/ipa/*.ipa + if-no-files-found: error + + publish-ios: + needs: build-ios + runs-on: macos-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: ios-ipa + path: ipa + + - name: Upload to App Store Connect + env: + ASC_API_KEY_BASE64: ${{ secrets.ASC_API_KEY_BASE64 }} + ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} + ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} + run: | + mkdir -p ~/.appstoreconnect/private_keys + echo "$ASC_API_KEY_BASE64" | base64 -d > "$HOME/.appstoreconnect/private_keys/AuthKey_${ASC_KEY_ID}.p8" + IPA=$(ls ipa/*.ipa | head -n 1) + xcrun altool --upload-app -t ios -f "$IPA" \ + --apiKey "$ASC_KEY_ID" \ + --apiIssuer "$ASC_ISSUER_ID" From 0cd7755200aac88ef1278319690a83e38a8c5fc8 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 14:35:16 -0700 Subject: [PATCH 127/235] Update pubspec lock --- pubspec.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index d9ee66b6..84a08150 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -835,5 +835,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.10.3 <4.0.0" - flutter: ">=3.38.4" + dart: ">=3.11.0 <4.0.0" + flutter: ">=3.41.0" From 71b933504b8e49a1d9f5f99dadd21ff6a0b46891 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 14:38:16 -0700 Subject: [PATCH 128/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 11752b72..2d53583b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 9.7.18+135 +version: 9.7.19+136 environment: sdk: ^3.7.2 From de24cd1ff09c44e520fecdab9125b3cf8e2bceb7 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 14:46:11 -0700 Subject: [PATCH 129/235] Stop tracking pubspec.lock and ios/Podfile.lock Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitignore | 2 + ios/Podfile.lock | 276 ---------------- pubspec.lock | 839 ----------------------------------------------- 3 files changed, 2 insertions(+), 1115 deletions(-) delete mode 100644 ios/Podfile.lock delete mode 100644 pubspec.lock diff --git a/.gitignore b/.gitignore index c8d4b0fb..a8934b8f 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,8 @@ migrate_working_dir/ .pub-cache/ .pub/ /build/ +pubspec.lock +ios/Podfile.lock # Symbolication related app.*.symbols diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index cc93428b..00000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,276 +0,0 @@ -PODS: - - app_links (7.0.0): - - Flutter - - app_settings (6.1.2): - - Flutter - - Firebase/CoreOnly (12.12.0): - - FirebaseCore (~> 12.12.0) - - Firebase/Crashlytics (12.12.0): - - Firebase/CoreOnly - - FirebaseCrashlytics (~> 12.12.0) - - Firebase/Messaging (12.12.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 12.12.0) - - firebase_analytics (12.3.0): - - firebase_core - - FirebaseAnalytics (= 12.12.0) - - Flutter - - firebase_core (4.7.0): - - Firebase/CoreOnly (= 12.12.0) - - Flutter - - firebase_crashlytics (5.2.0): - - Firebase/Crashlytics (= 12.12.0) - - firebase_core - - Flutter - - firebase_messaging (16.2.0): - - Firebase/Messaging (= 12.12.0) - - firebase_core - - Flutter - - FirebaseAnalytics (12.12.0): - - FirebaseAnalytics/Default (= 12.12.0) - - FirebaseCore (~> 12.12.0) - - FirebaseInstallations (~> 12.12.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - FirebaseAnalytics/Default (12.12.0): - - FirebaseCore (~> 12.12.0) - - FirebaseInstallations (~> 12.12.0) - - GoogleAppMeasurement/Default (= 12.12.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - FirebaseCore (12.12.1): - - FirebaseCoreInternal (~> 12.12.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreExtension (12.12.0): - - FirebaseCore (~> 12.12.0) - - FirebaseCoreInternal (12.12.0): - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseCrashlytics (12.12.1): - - FirebaseCore (~> 12.12.0) - - FirebaseInstallations (~> 12.12.0) - - FirebaseRemoteConfigInterop (~> 12.12.0) - - FirebaseSessions (~> 12.12.0) - - GoogleDataTransport (~> 10.1) - - GoogleUtilities/Environment (~> 8.1) - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - FirebaseInstallations (12.12.0): - - FirebaseCore (~> 12.12.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - PromisesObjC (~> 2.4) - - FirebaseMessaging (12.12.0): - - FirebaseCore (~> 12.12.0) - - FirebaseInstallations (~> 12.12.0) - - GoogleDataTransport (~> 10.1) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Reachability (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - nanopb (~> 3.30910.0) - - FirebaseRemoteConfigInterop (12.12.0) - - FirebaseSessions (12.12.0): - - FirebaseCore (~> 12.12.0) - - FirebaseCoreExtension (~> 12.12.0) - - FirebaseInstallations (~> 12.12.0) - - GoogleDataTransport (~> 10.1) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - nanopb (~> 3.30910.0) - - PromisesSwift (~> 2.1) - - Flutter (1.0.0) - - flutter_background_geolocation (5.1.2): - - Flutter - - TSLocationManager (~> 4.1.0) - - flutter_secure_storage_darwin (10.0.0): - - Flutter - - FlutterMacOS - - GoogleAdsOnDeviceConversion (3.4.2): - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/Core (12.12.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/Default (12.12.0): - - GoogleAdsOnDeviceConversion (~> 3.4.0) - - GoogleAppMeasurement/Core (= 12.12.0) - - GoogleAppMeasurement/IdentitySupport (= 12.12.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/IdentitySupport (12.12.0): - - GoogleAppMeasurement/Core (= 12.12.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - GoogleDataTransport (10.1.0): - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - GoogleUtilities/AppDelegateSwizzler (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.0): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.0)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.0) - - GoogleUtilities/Reachability (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - mobile_scanner (7.0.0): - - Flutter - - FlutterMacOS - - nanopb (3.30910.0): - - nanopb/decode (= 3.30910.0) - - nanopb/encode (= 3.30910.0) - - nanopb/decode (3.30910.0) - - nanopb/encode (3.30910.0) - - PromisesObjC (2.4.0) - - PromisesSwift (2.4.0): - - PromisesObjC (= 2.4.0) - - quick_actions_ios (0.0.1): - - Flutter - - rate_my_app (2.3.2): - - Flutter - - FlutterMacOS - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - - TSBackgroundFetch (4.1.1) - - TSLocationManager (4.1.6): - - TSBackgroundFetch (~> 4.1.0) - -DEPENDENCIES: - - app_links (from `.symlinks/plugins/app_links/ios`) - - app_settings (from `.symlinks/plugins/app_settings/ios`) - - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) - - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - Flutter (from `Flutter`) - - flutter_background_geolocation (from `.symlinks/plugins/flutter_background_geolocation/ios`) - - flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`) - - mobile_scanner (from `.symlinks/plugins/mobile_scanner/darwin`) - - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`) - - rate_my_app (from `.symlinks/plugins/rate_my_app/darwin`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreExtension - - FirebaseCoreInternal - - FirebaseCrashlytics - - FirebaseInstallations - - FirebaseMessaging - - FirebaseRemoteConfigInterop - - FirebaseSessions - - GoogleAdsOnDeviceConversion - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleUtilities - - nanopb - - PromisesObjC - - PromisesSwift - - TSBackgroundFetch - - TSLocationManager - -EXTERNAL SOURCES: - app_links: - :path: ".symlinks/plugins/app_links/ios" - app_settings: - :path: ".symlinks/plugins/app_settings/ios" - firebase_analytics: - :path: ".symlinks/plugins/firebase_analytics/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_crashlytics: - :path: ".symlinks/plugins/firebase_crashlytics/ios" - firebase_messaging: - :path: ".symlinks/plugins/firebase_messaging/ios" - Flutter: - :path: Flutter - flutter_background_geolocation: - :path: ".symlinks/plugins/flutter_background_geolocation/ios" - flutter_secure_storage_darwin: - :path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin" - mobile_scanner: - :path: ".symlinks/plugins/mobile_scanner/darwin" - quick_actions_ios: - :path: ".symlinks/plugins/quick_actions_ios/ios" - rate_my_app: - :path: ".symlinks/plugins/rate_my_app/darwin" - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - -SPEC CHECKSUMS: - app_links: a754cbec3c255bd4bbb4d236ecc06f28cd9a7ce8 - app_settings: 0341ec6daa4f0c50f5a421bf0ad7c36084db6e90 - Firebase: aa154fee4e9b8eac17aa42344988865b3e857d33 - firebase_analytics: e5f4faccf1f7040d3788e835b7eb7b57dc84a911 - firebase_core: 9156a152117c843440b0b990c785aa0259bc5447 - firebase_crashlytics: e24acd48861c5edf6e0f6c134d6a0b28593c76d7 - firebase_messaging: 0d962ab44ff24ed36deb8fa2ee043c4671858269 - FirebaseAnalytics: db0dca7e35a503ddf6869e457f4926dc35afe216 - FirebaseCore: 86241206e656f5c80c995e370e6c975913b9b284 - FirebaseCoreExtension: ff6fd42eb5287e71d3e160450de6509733d9ead7 - FirebaseCoreInternal: 7c12fc3011d889085e765e317d7b9fd1cef97af9 - FirebaseCrashlytics: 03f4e20d0c9b7fd6338cb9066f4bfb69d3f42fd0 - FirebaseInstallations: 4e6e162aa4abaaeeeb01dd00179dfc5ad9c2194e - FirebaseMessaging: 341004946fa7ffc741344b20f1b667514fc93e31 - FirebaseRemoteConfigInterop: 23996ab7397494722df4fdd1fd398024389d5da8 - FirebaseSessions: 804bd321f2d2f2ddafe74ef7856062aa19f179c2 - Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - flutter_background_geolocation: 1e75dac050fd6dd7c59c497edf7aa755dfde3eb7 - flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23 - GoogleAdsOnDeviceConversion: 02fc8fe599acd867e328321effb0d9b2d023a38a - GoogleAppMeasurement: 3b4687de50ab25ee2d4d541849f10ca8df862a12 - GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93 - nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 - quick_actions_ios: 500fcc11711d9f646739093395c4ae8eec25f779 - rate_my_app: cbb89973f870601f80f7bad63aba107260cabc5b - shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb - TSBackgroundFetch: 18918b6449a1e3f01eb0f5b44d6d79ce6160a5a5 - TSLocationManager: 7dd12e7e98191abc74327a017560c4eced17a83d - -PODFILE CHECKSUM: ce2a4dd764e1c7aeed6a7cdc5e61d092b6dc6d32 - -COCOAPODS: 1.16.2 diff --git a/pubspec.lock b/pubspec.lock deleted file mode 100644 index 84a08150..00000000 --- a/pubspec.lock +++ /dev/null @@ -1,839 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _flutterfire_internals: - dependency: transitive - description: - name: _flutterfire_internals - sha256: "8f89e371e2883de35cdc78f648e725fa4da5f3b6c927269f00fa68f1ea92b598" - url: "https://pub.dev" - source: hosted - version: "1.3.71" - app_links: - dependency: "direct main" - description: - name: app_links - sha256: "3462d9defc61565fde4944858b59bec5be2b9d5b05f20aed190adb3ad08a7abc" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - app_links_linux: - dependency: transitive - description: - name: app_links_linux - sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 - url: "https://pub.dev" - source: hosted - version: "1.0.3" - app_links_platform_interface: - dependency: transitive - description: - name: app_links_platform_interface - sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - app_links_web: - dependency: transitive - description: - name: app_links_web - sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 - url: "https://pub.dev" - source: hosted - version: "1.0.4" - app_settings: - dependency: "direct main" - description: - name: app_settings - sha256: "64d50e666fd96ae90301bf71205f05019286f940ad6f5fed3d1be19c6af7546a" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - archive: - dependency: transitive - description: - name: archive - sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.dev" - source: hosted - version: "4.0.9" - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 - url: "https://pub.dev" - source: hosted - version: "2.13.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - characters: - dependency: transitive - description: - name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.dev" - source: hosted - version: "1.4.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.dev" - source: hosted - version: "2.0.4" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.dev" - source: hosted - version: "0.4.2" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - code_assets: - dependency: transitive - description: - name: code_assets - sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - crypto: - dependency: transitive - description: - name: crypto - sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" - source: hosted - version: "3.0.7" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - ffi: - dependency: transitive - description: - name: ffi - sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" - firebase_analytics: - dependency: "direct main" - description: - name: firebase_analytics - sha256: "56641bc6dd7b6a8c63ad5f5d46664af5b66db452f1c5ad052b1eec0188cf3183" - url: "https://pub.dev" - source: hosted - version: "12.4.1" - firebase_analytics_platform_interface: - dependency: transitive - description: - name: firebase_analytics_platform_interface - sha256: "432492ba57024a35dfb67ebcf0c64bac31e19d2c46b3dd222bccbc05f8839efe" - url: "https://pub.dev" - source: hosted - version: "6.0.1" - firebase_analytics_web: - dependency: transitive - description: - name: firebase_analytics_web - sha256: e613fca6511ab8f13adb355f7bc486c49fa6aea72fb6703cfb34df29b3b568a6 - url: "https://pub.dev" - source: hosted - version: "0.6.1+7" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - sha256: "93a5bde9775fd5adcc937f39dfa04ae0bc89c4d79bea6abc49de3f7b049d9ff6" - url: "https://pub.dev" - source: hosted - version: "4.9.0" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - sha256: "4a120366dbf7d5a8ee9438978530b664b855728fb8dcc3a201017660817e555b" - url: "https://pub.dev" - source: hosted - version: "7.0.1" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - sha256: "7c98f10b8c8e5adedc0b810b66a877120696675e2c22d9ca9caca092da0d9e57" - url: "https://pub.dev" - source: hosted - version: "3.7.0" - firebase_crashlytics: - dependency: "direct main" - description: - name: firebase_crashlytics - sha256: "9935ea36aaae0dfc789b80a1981fd70c6c7e9956791e9e7c2210ab83f9c963bd" - url: "https://pub.dev" - source: hosted - version: "5.2.2" - firebase_crashlytics_platform_interface: - dependency: transitive - description: - name: firebase_crashlytics_platform_interface - sha256: ade20d7d86698ded596bf16ab0e7060ef1dae9258ab6705536a39ae047ccef59 - url: "https://pub.dev" - source: hosted - version: "3.8.22" - firebase_messaging: - dependency: "direct main" - description: - name: firebase_messaging - sha256: "8d0dc81a31cd030170508dc3e89bfd14355b20a1b991340af5f018e37daab5d7" - url: "https://pub.dev" - source: hosted - version: "16.2.2" - firebase_messaging_platform_interface: - dependency: transitive - description: - name: firebase_messaging_platform_interface - sha256: "37abb0b0535c5497605ee94c12470e1ebbbe47e71a22d0c20bffcc912311f8cb" - url: "https://pub.dev" - source: hosted - version: "4.7.11" - firebase_messaging_web: - dependency: transitive - description: - name: firebase_messaging_web - sha256: "54e22b43e2c26a2728a3f68c188de0f9011993ae19ae959a06d476dad935c776" - url: "https://pub.dev" - source: hosted - version: "4.1.7" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_background_geolocation: - dependency: "direct main" - description: - name: flutter_background_geolocation - sha256: "5281a0ca75b603dfd5557cb4a24c2f79b991591cbc73bd4da504a03a129b4344" - url: "https://pub.dev" - source: hosted - version: "5.2.0" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" - url: "https://pub.dev" - source: hosted - version: "0.14.4" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_rating_bar: - dependency: transitive - description: - name: flutter_rating_bar - sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 - url: "https://pub.dev" - source: hosted - version: "4.0.1" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - sha256: "6848263f9744072d0977347c383fb8b57d9780319a6bf5238b5a2866a029de62" - url: "https://pub.dev" - source: hosted - version: "10.2.0" - flutter_secure_storage_darwin: - dependency: transitive - description: - name: flutter_secure_storage_darwin - sha256: "3af15a3cb2bf5b8b776832bd01776f8018766aece55623176e28b406481fb320" - url: "https://pub.dev" - source: hosted - version: "0.3.0" - flutter_secure_storage_linux: - dependency: transitive - description: - name: flutter_secure_storage_linux - sha256: "2b5c76dce569ab752d55a1cee6a2242bcc11fdba927078fb88c503f150767cda" - url: "https://pub.dev" - source: hosted - version: "3.0.0" - flutter_secure_storage_platform_interface: - dependency: transitive - description: - name: flutter_secure_storage_platform_interface - sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6" - url: "https://pub.dev" - source: hosted - version: "2.0.1" - flutter_secure_storage_web: - dependency: transitive - description: - name: flutter_secure_storage_web - sha256: "073a62b3aeb866ab4ce795f960413948e51e5a42a9b0c8333b6daf5bb3208a1c" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - flutter_secure_storage_windows: - dependency: transitive - description: - name: flutter_secure_storage_windows - sha256: "3b7c8e068875dfd46719ff57c90d8c459c87f2302ed6b00ff006b3c9fcad1613" - url: "https://pub.dev" - source: hosted - version: "4.1.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - glob: - dependency: transitive - description: - name: glob - sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de - url: "https://pub.dev" - source: hosted - version: "2.1.3" - gtk: - dependency: transitive - description: - name: gtk - sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c - url: "https://pub.dev" - source: hosted - version: "2.1.0" - hooks: - dependency: transitive - description: - name: hooks - sha256: "025f060e86d2d4c3c47b56e33caf7f93bf9283340f26d23424ebcfccf34f621e" - url: "https://pub.dev" - source: hosted - version: "1.0.3" - image: - dependency: transitive - description: - name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.dev" - source: hosted - version: "4.8.0" - intl: - dependency: "direct main" - description: - name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev" - source: hosted - version: "0.20.2" - jni: - dependency: transitive - description: - name: jni - sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f - url: "https://pub.dev" - source: hosted - version: "1.0.0" - jni_flutter: - dependency: transitive - description: - name: jni_flutter - sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 - url: "https://pub.dev" - source: hosted - version: "4.11.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" - source: hosted - version: "11.0.2" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" - source: hosted - version: "3.0.10" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - lints: - dependency: transitive - description: - name: lints - sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 - url: "https://pub.dev" - source: hosted - version: "0.12.19" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.dev" - source: hosted - version: "0.13.0" - meta: - dependency: transitive - description: - name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" - url: "https://pub.dev" - source: hosted - version: "1.17.0" - mobile_scanner: - dependency: "direct main" - description: - name: mobile_scanner - sha256: c92c26bf2231695b6d3477c8dcf435f51e28f87b1745966b1fe4c47a286171ce - url: "https://pub.dev" - source: hosted - version: "7.2.0" - native_toolchain_c: - dependency: transitive - description: - name: native_toolchain_c - sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572" - url: "https://pub.dev" - source: hosted - version: "0.17.6" - objective_c: - dependency: transitive - description: - name: objective_c - sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" - url: "https://pub.dev" - source: hosted - version: "9.3.0" - package_config: - dependency: transitive - description: - name: package_config - sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.dev" - source: hosted - version: "2.2.0" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - path_provider: - dependency: transitive - description: - name: path_provider - sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev" - source: hosted - version: "2.1.5" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" - url: "https://pub.dev" - source: hosted - version: "2.3.1" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" - url: "https://pub.dev" - source: hosted - version: "2.6.0" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" - source: hosted - version: "2.2.1" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" - source: hosted - version: "2.3.0" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" - url: "https://pub.dev" - source: hosted - version: "7.0.2" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" - url: "https://pub.dev" - source: hosted - version: "6.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - quick_actions: - dependency: "direct main" - description: - name: quick_actions - sha256: "7e35dd6a21f5bbd21acf6899039eaf85001a5ac26d52cbd6a8a2814505b90798" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - quick_actions_android: - dependency: transitive - description: - name: quick_actions_android - sha256: "8e491323342fa68420ca26a9bd5a2bbcdb526bda33db45b6427c6d139fb7316d" - url: "https://pub.dev" - source: hosted - version: "1.0.29" - quick_actions_ios: - dependency: transitive - description: - name: quick_actions_ios - sha256: be1496e7ca1debc86d9ea08e56325649fbc5abb2b6930690c97ba0dae59992b1 - url: "https://pub.dev" - source: hosted - version: "1.2.4" - quick_actions_platform_interface: - dependency: transitive - description: - name: quick_actions_platform_interface - sha256: "1fec7068db5122cd019e9340d3d7be5d36eab099695ef3402c7059ee058329a4" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - rate_my_app: - dependency: "direct main" - description: - name: rate_my_app - sha256: "910f6fbe6c070a204dc0595f876352621203a4829d72fc2771c3a1f443132721" - url: "https://pub.dev" - source: hosted - version: "2.4.0" - record_use: - dependency: transitive - description: - name: record_use - sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" - url: "https://pub.dev" - source: hosted - version: "0.6.0" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf - url: "https://pub.dev" - source: hosted - version: "2.5.5" - shared_preferences_android: - dependency: "direct main" - description: - name: shared_preferences_android - sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 - url: "https://pub.dev" - source: hosted - version: "2.4.23" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" - url: "https://pub.dev" - source: hosted - version: "2.5.6" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" - url: "https://pub.dev" - source: hosted - version: "2.4.2" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" - source: hosted - version: "2.4.3" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" - url: "https://pub.dev" - source: hosted - version: "1.10.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" - url: "https://pub.dev" - source: hosted - version: "0.7.10" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" - source: hosted - version: "2.2.0" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" - url: "https://pub.dev" - source: hosted - version: "15.1.0" - wakelock_partial_android: - dependency: "direct main" - description: - name: wakelock_partial_android - sha256: "480cc8a207cad47d9aa37c7d5da7f153e00396a71014f174806b1fe6c2edede7" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - web: - dependency: transitive - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - win32: - dependency: transitive - description: - name: win32 - sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.dev" - source: hosted - version: "5.15.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" - source: hosted - version: "6.6.1" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" -sdks: - dart: ">=3.11.0 <4.0.0" - flutter: ">=3.41.0" From 81f094a86ec36bb5749eaa283f40fe4284098b13 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 17:54:16 -0700 Subject: [PATCH 130/235] Auto-expire release artifacts after one day (#186) Co-authored-by: Claude Opus 4.7 (1M context) --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 74860069..eecd2000 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,6 +50,7 @@ jobs: name: android-apk path: build/app/outputs/flutter-apk/app-release.apk if-no-files-found: error + retention-days: 1 smoke-test-android: needs: build-android @@ -197,6 +198,7 @@ jobs: name: ios-ipa path: ${{ runner.temp }}/ipa/*.ipa if-no-files-found: error + retention-days: 1 publish-ios: needs: build-ios From 45ca013b1b2d771adf0c8ab05361cbdd9cf0ae9a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 17:56:31 -0700 Subject: [PATCH 131/235] Install flutterfire CLI in iOS build job (#187) The Xcode project has a Run Script build phase that invokes 'flutterfire upload-crashlytics-symbols' to push dSYMs to Firebase Crashlytics. The CLI isn't installed on the macOS runner by default, which fails the iOS archive step. The build script already adds \$HOME/.pub-cache/bin to PATH, so dart pub global activate flutterfire_cli is sufficient. Co-authored-by: Claude Opus 4.7 (1M context) --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eecd2000..5de548c9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -118,6 +118,9 @@ jobs: channel: stable cache: true + - name: Install flutterfire CLI + run: dart pub global activate flutterfire_cli + - name: Import signing certificate into temp keychain env: CERT_P12_BASE64: ${{ secrets.IOS_DIST_CERT_P12_BASE64 }} From 7635cfae58e80d82b0f885d2ea3c03922ea21200 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 18:31:16 -0700 Subject: [PATCH 132/235] Add manual trigger option --- .github/workflows/release.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5de548c9..68a2b5f9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,6 +3,13 @@ name: Release on: push: tags: ['v*'] + workflow_dispatch: + inputs: + platform: + description: Platforms to publish + type: choice + options: [both, android, ios] + default: both env: APPLE_TEAM_ID: YW49KTJKFW @@ -10,6 +17,7 @@ env: jobs: build-android: + if: ${{ github.event_name == 'push' || inputs.platform != 'ios' }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 @@ -109,6 +117,7 @@ jobs: status: completed build-ios: + if: ${{ github.event_name == 'push' || inputs.platform != 'android' }} runs-on: macos-latest steps: - uses: actions/checkout@v6 From 213343a80b775bb2d90ca94843b420a906e878c3 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 18:33:18 -0700 Subject: [PATCH 133/235] Fix iOS build issue --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 68a2b5f9..c83bb052 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -194,6 +194,7 @@ jobs: -authenticationKeyPath "$API_KEY_PATH" \ -authenticationKeyID "$ASC_KEY_ID" \ -authenticationKeyIssuerID "$ASC_ISSUER_ID" \ + CODE_SIGN_IDENTITY="Apple Distribution" \ archive xcodebuild \ -exportArchive \ From 734ec24d013ad49c5b79a0f4dfcf9afd95585417 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 18:47:14 -0700 Subject: [PATCH 134/235] Fix iOS release --- .github/workflows/release.yml | 1 - ios/Runner.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c83bb052..68a2b5f9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -194,7 +194,6 @@ jobs: -authenticationKeyPath "$API_KEY_PATH" \ -authenticationKeyID "$ASC_KEY_ID" \ -authenticationKeyIssuerID "$ASC_ISSUER_ID" \ - CODE_SIGN_IDENTITY="Apple Distribution" \ archive xcodebuild \ -exportArchive \ diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 90c20c6e..979760c8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -687,7 +687,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -747,7 +747,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = "Apple Distribution"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = YW49KTJKFW; From 9cb36f855e9dc08c228026f97662ba21c4accbbd Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 18:58:14 -0700 Subject: [PATCH 135/235] Try another release fix --- ios/Runner.xcodeproj/project.pbxproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 979760c8..f6e30acf 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -687,7 +687,6 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -747,7 +746,6 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "Apple Distribution"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = YW49KTJKFW; From 04eb003486661e48682688ed67a7dfd50650623d Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 21:19:18 -0700 Subject: [PATCH 136/235] Try codemagic-cli-tools --- .github/workflows/release.yml | 80 ++++++++++------------------ ios/Runner.xcodeproj/project.pbxproj | 2 + 2 files changed, 30 insertions(+), 52 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 68a2b5f9..c1bc10d8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -130,80 +130,56 @@ jobs: - name: Install flutterfire CLI run: dart pub global activate flutterfire_cli - - name: Import signing certificate into temp keychain + - name: Install codemagic-cli-tools + run: pip3 install --break-system-packages codemagic-cli-tools + + - name: Initialize signing keychain env: - CERT_P12_BASE64: ${{ secrets.IOS_DIST_CERT_P12_BASE64 }} - CERT_PASSWORD: ${{ secrets.IOS_DIST_CERT_PASSWORD }} KEYCHAIN_PASSWORD: ${{ secrets.IOS_KEYCHAIN_PASSWORD }} - run: | - KEYCHAIN_PATH="$RUNNER_TEMP/build.keychain-db" - echo "$CERT_P12_BASE64" | base64 -d > "$RUNNER_TEMP/cert.p12" - security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" - security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH" - security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" - security import "$RUNNER_TEMP/cert.p12" -P "$CERT_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH" - security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" - security list-keychain -d user -s "$KEYCHAIN_PATH" $(security list-keychains -d user | tr -d '"') - - - name: Install App Store Connect API key - env: - ASC_API_KEY_BASE64: ${{ secrets.ASC_API_KEY_BASE64 }} - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - run: | - mkdir -p ~/.appstoreconnect/private_keys - echo "$ASC_API_KEY_BASE64" | base64 -d > "$HOME/.appstoreconnect/private_keys/AuthKey_${ASC_KEY_ID}.p8" + run: keychain initialize --password "$KEYCHAIN_PASSWORD" - - name: Write ExportOptions.plist + - name: Fetch signing files from App Store Connect + env: + APP_STORE_CONNECT_KEY_IDENTIFIER: ${{ secrets.ASC_KEY_ID }} + APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} + APP_STORE_CONNECT_PRIVATE_KEY: ${{ secrets.ASC_API_KEY_BASE64 }} + CERTIFICATE_PRIVATE_KEY_BASE64: ${{ secrets.IOS_DIST_CERT_P12_BASE64 }} + CERTIFICATE_PASSWORD: ${{ secrets.IOS_DIST_CERT_PASSWORD }} run: | - cat > ios/ExportOptions.plist < - - - - method - app-store - teamID - ${APPLE_TEAM_ID} - signingStyle - automatic - uploadSymbols - - destination - upload - - - EOF + echo "$APP_STORE_CONNECT_PRIVATE_KEY" | base64 -d > "$RUNNER_TEMP/AuthKey.p8" + echo "$CERTIFICATE_PRIVATE_KEY_BASE64" | base64 -d > "$RUNNER_TEMP/cert.p12" + app-store-connect fetch-signing-files "$IOS_BUNDLE_ID" \ + --type IOS_APP_STORE \ + --certificate-key-password "$CERTIFICATE_PASSWORD" \ + --p12-container-password "$CERTIFICATE_PASSWORD" \ + --private-key "@file:$RUNNER_TEMP/AuthKey.p8" \ + --create + + - name: Install certificates into keychain + run: keychain add-certificates + + - name: Apply profiles to Xcode project and generate ExportOptions.plist + working-directory: ios + run: xcode-project use-profiles --export-options-plist "$RUNNER_TEMP/ExportOptions.plist" - name: Archive and export IPA - env: - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} run: | flutter pub get flutter build ios --release --no-codesign ARCHIVE_PATH="$RUNNER_TEMP/Runner.xcarchive" EXPORT_PATH="$RUNNER_TEMP/ipa" - API_KEY_PATH="$HOME/.appstoreconnect/private_keys/AuthKey_${ASC_KEY_ID}.p8" cd ios xcodebuild \ -workspace Runner.xcworkspace \ -scheme Runner \ -configuration Release \ -archivePath "$ARCHIVE_PATH" \ - -allowProvisioningUpdates \ - -authenticationKeyPath "$API_KEY_PATH" \ - -authenticationKeyID "$ASC_KEY_ID" \ - -authenticationKeyIssuerID "$ASC_ISSUER_ID" \ archive xcodebuild \ -exportArchive \ -archivePath "$ARCHIVE_PATH" \ -exportPath "$EXPORT_PATH" \ - -exportOptionsPlist ExportOptions.plist \ - -allowProvisioningUpdates \ - -authenticationKeyPath "$API_KEY_PATH" \ - -authenticationKeyID "$ASC_KEY_ID" \ - -authenticationKeyIssuerID "$ASC_ISSUER_ID" + -exportOptionsPlist "$RUNNER_TEMP/ExportOptions.plist" - uses: actions/upload-artifact@v4 with: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index f6e30acf..90c20c6e 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -687,6 +687,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -746,6 +747,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = YW49KTJKFW; From c067558dadeb16b7d8073b7988568faf74effef9 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 21:24:41 -0700 Subject: [PATCH 137/235] Another iOS release attempt --- .github/workflows/release.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c1bc10d8..8d427898 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -138,26 +138,26 @@ jobs: KEYCHAIN_PASSWORD: ${{ secrets.IOS_KEYCHAIN_PASSWORD }} run: keychain initialize --password "$KEYCHAIN_PASSWORD" - - name: Fetch signing files from App Store Connect + - name: Install signing certificate into keychain + env: + CERT_P12_BASE64: ${{ secrets.IOS_DIST_CERT_P12_BASE64 }} + CERT_PASSWORD: ${{ secrets.IOS_DIST_CERT_PASSWORD }} + run: | + echo "$CERT_P12_BASE64" | base64 -d > "$RUNNER_TEMP/cert.p12" + keychain add-certificates --certificate "$RUNNER_TEMP/cert.p12" --certificate-password "$CERT_PASSWORD" + + - name: Fetch provisioning profile from App Store Connect env: APP_STORE_CONNECT_KEY_IDENTIFIER: ${{ secrets.ASC_KEY_ID }} APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - APP_STORE_CONNECT_PRIVATE_KEY: ${{ secrets.ASC_API_KEY_BASE64 }} - CERTIFICATE_PRIVATE_KEY_BASE64: ${{ secrets.IOS_DIST_CERT_P12_BASE64 }} - CERTIFICATE_PASSWORD: ${{ secrets.IOS_DIST_CERT_PASSWORD }} + ASC_API_KEY_BASE64: ${{ secrets.ASC_API_KEY_BASE64 }} run: | - echo "$APP_STORE_CONNECT_PRIVATE_KEY" | base64 -d > "$RUNNER_TEMP/AuthKey.p8" - echo "$CERTIFICATE_PRIVATE_KEY_BASE64" | base64 -d > "$RUNNER_TEMP/cert.p12" + echo "$ASC_API_KEY_BASE64" | base64 -d > "$RUNNER_TEMP/AuthKey.p8" + export APP_STORE_CONNECT_PRIVATE_KEY="$(cat "$RUNNER_TEMP/AuthKey.p8")" app-store-connect fetch-signing-files "$IOS_BUNDLE_ID" \ --type IOS_APP_STORE \ - --certificate-key-password "$CERTIFICATE_PASSWORD" \ - --p12-container-password "$CERTIFICATE_PASSWORD" \ - --private-key "@file:$RUNNER_TEMP/AuthKey.p8" \ --create - - name: Install certificates into keychain - run: keychain add-certificates - - name: Apply profiles to Xcode project and generate ExportOptions.plist working-directory: ios run: xcode-project use-profiles --export-options-plist "$RUNNER_TEMP/ExportOptions.plist" From 24e83a4f98513aa90b9153e5ffbbbd28c337b487 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 21:30:39 -0700 Subject: [PATCH 138/235] Fix certificate key --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8d427898..ba6d80c9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -145,6 +145,7 @@ jobs: run: | echo "$CERT_P12_BASE64" | base64 -d > "$RUNNER_TEMP/cert.p12" keychain add-certificates --certificate "$RUNNER_TEMP/cert.p12" --certificate-password "$CERT_PASSWORD" + openssl pkcs12 -in "$RUNNER_TEMP/cert.p12" -nodes -nocerts -password "pass:$CERT_PASSWORD" -out "$RUNNER_TEMP/cert_private_key.pem" - name: Fetch provisioning profile from App Store Connect env: @@ -156,6 +157,7 @@ jobs: export APP_STORE_CONNECT_PRIVATE_KEY="$(cat "$RUNNER_TEMP/AuthKey.p8")" app-store-connect fetch-signing-files "$IOS_BUNDLE_ID" \ --type IOS_APP_STORE \ + --certificate-key="@file:$RUNNER_TEMP/cert_private_key.pem" \ --create - name: Apply profiles to Xcode project and generate ExportOptions.plist From 426b95fa8d3c6421e89a697f9ee570518aeeae11 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 21:39:25 -0700 Subject: [PATCH 139/235] Try another iOS fix --- .github/workflows/release.yml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ba6d80c9..d82c6be3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -138,26 +138,19 @@ jobs: KEYCHAIN_PASSWORD: ${{ secrets.IOS_KEYCHAIN_PASSWORD }} run: keychain initialize --password "$KEYCHAIN_PASSWORD" - - name: Install signing certificate into keychain + - name: Decode App Store Connect API key env: - CERT_P12_BASE64: ${{ secrets.IOS_DIST_CERT_P12_BASE64 }} - CERT_PASSWORD: ${{ secrets.IOS_DIST_CERT_PASSWORD }} - run: | - echo "$CERT_P12_BASE64" | base64 -d > "$RUNNER_TEMP/cert.p12" - keychain add-certificates --certificate "$RUNNER_TEMP/cert.p12" --certificate-password "$CERT_PASSWORD" - openssl pkcs12 -in "$RUNNER_TEMP/cert.p12" -nodes -nocerts -password "pass:$CERT_PASSWORD" -out "$RUNNER_TEMP/cert_private_key.pem" + ASC_API_KEY_BASE64: ${{ secrets.ASC_API_KEY_BASE64 }} + run: echo "$ASC_API_KEY_BASE64" | base64 -d > "$RUNNER_TEMP/AuthKey.p8" - - name: Fetch provisioning profile from App Store Connect + - name: Fetch signing files from App Store Connect env: APP_STORE_CONNECT_KEY_IDENTIFIER: ${{ secrets.ASC_KEY_ID }} APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_API_KEY_BASE64: ${{ secrets.ASC_API_KEY_BASE64 }} run: | - echo "$ASC_API_KEY_BASE64" | base64 -d > "$RUNNER_TEMP/AuthKey.p8" - export APP_STORE_CONNECT_PRIVATE_KEY="$(cat "$RUNNER_TEMP/AuthKey.p8")" app-store-connect fetch-signing-files "$IOS_BUNDLE_ID" \ --type IOS_APP_STORE \ - --certificate-key="@file:$RUNNER_TEMP/cert_private_key.pem" \ + --private-key "@file:$RUNNER_TEMP/AuthKey.p8" \ --create - name: Apply profiles to Xcode project and generate ExportOptions.plist From 4c81a66a6f91869c3aa7f3b30e665ae5fb546033 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 21:47:55 -0700 Subject: [PATCH 140/235] Another iOS release attempt --- .github/workflows/release.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d82c6be3..911b0f24 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -143,6 +143,11 @@ jobs: ASC_API_KEY_BASE64: ${{ secrets.ASC_API_KEY_BASE64 }} run: echo "$ASC_API_KEY_BASE64" | base64 -d > "$RUNNER_TEMP/AuthKey.p8" + - name: Write distribution signing private key + env: + IOS_DIST_PRIVATE_KEY: ${{ secrets.IOS_DIST_PRIVATE_KEY }} + run: printf '%s' "$IOS_DIST_PRIVATE_KEY" > "$RUNNER_TEMP/dist_private_key.pem" + - name: Fetch signing files from App Store Connect env: APP_STORE_CONNECT_KEY_IDENTIFIER: ${{ secrets.ASC_KEY_ID }} @@ -151,6 +156,7 @@ jobs: app-store-connect fetch-signing-files "$IOS_BUNDLE_ID" \ --type IOS_APP_STORE \ --private-key "@file:$RUNNER_TEMP/AuthKey.p8" \ + --certificate-key "@file:$RUNNER_TEMP/dist_private_key.pem" \ --create - name: Apply profiles to Xcode project and generate ExportOptions.plist From f1032613961aa0c68ce1a6e58cf68a252b31e008 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 22:01:42 -0700 Subject: [PATCH 141/235] Another release fix --- .github/workflows/release.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 911b0f24..816ae6ea 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -161,7 +161,10 @@ jobs: - name: Apply profiles to Xcode project and generate ExportOptions.plist working-directory: ios - run: xcode-project use-profiles --export-options-plist "$RUNNER_TEMP/ExportOptions.plist" + run: | + xcode-project use-profiles --export-options-plist "$RUNNER_TEMP/ExportOptions.plist" + /usr/libexec/PlistBuddy -c "Delete :signingCertificate" "$RUNNER_TEMP/ExportOptions.plist" || true + cat "$RUNNER_TEMP/ExportOptions.plist" - name: Archive and export IPA run: | From d701430204688e31b28a4004b2ed0f78fa28185a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 22:14:55 -0700 Subject: [PATCH 142/235] Another fix attempt --- .github/workflows/release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 816ae6ea..3b6ef249 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -159,12 +159,12 @@ jobs: --certificate-key "@file:$RUNNER_TEMP/dist_private_key.pem" \ --create + - name: Install certificates into keychain + run: keychain add-certificates + - name: Apply profiles to Xcode project and generate ExportOptions.plist working-directory: ios - run: | - xcode-project use-profiles --export-options-plist "$RUNNER_TEMP/ExportOptions.plist" - /usr/libexec/PlistBuddy -c "Delete :signingCertificate" "$RUNNER_TEMP/ExportOptions.plist" || true - cat "$RUNNER_TEMP/ExportOptions.plist" + run: xcode-project use-profiles --export-options-plist "$RUNNER_TEMP/ExportOptions.plist" - name: Archive and export IPA run: | From b1be1131c0c1b458b9b0c52da357f835c95c1fbd Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 22:25:51 -0700 Subject: [PATCH 143/235] Use latest MacOS for jobs --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3b6ef249..96626a8c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -118,7 +118,7 @@ jobs: build-ios: if: ${{ github.event_name == 'push' || inputs.platform != 'android' }} - runs-on: macos-latest + runs-on: macos-26 steps: - uses: actions/checkout@v6 @@ -194,7 +194,7 @@ jobs: publish-ios: needs: build-ios - runs-on: macos-latest + runs-on: macos-26 steps: - uses: actions/download-artifact@v4 with: From 86330763ea08deb4b32509aebef6d2cdaa238e60 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 17 May 2026 22:28:32 -0700 Subject: [PATCH 144/235] Minor workflow cleanup --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 96626a8c..ee26ed49 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,6 @@ on: default: both env: - APPLE_TEAM_ID: YW49KTJKFW IOS_BUNDLE_ID: org.traccar.client.TraccarClient jobs: From 659310cb7c432a2aa13a150685826b229cfc980e Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 18 May 2026 06:25:08 -0700 Subject: [PATCH 145/235] Update release workflow --- .github/workflows/release.yml | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ee26ed49..04fb2b50 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,7 +52,7 @@ jobs: flutter pub get flutter build apk --release - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: android-apk path: build/app/outputs/flutter-apk/app-release.apk @@ -69,7 +69,7 @@ jobs: sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: android-apk path: . @@ -91,7 +91,7 @@ jobs: adb pull /sdcard/launch.png launch.png adb shell pidof org.traccar.client > /dev/null || { echo "App process not running after launch — crashed."; exit 1; } - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: launch-screenshot path: launch.png @@ -101,7 +101,7 @@ jobs: needs: smoke-test-android runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: android-apk path: apk @@ -184,7 +184,7 @@ jobs: -exportPath "$EXPORT_PATH" \ -exportOptionsPlist "$RUNNER_TEMP/ExportOptions.plist" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: ios-ipa path: ${{ runner.temp }}/ipa/*.ipa @@ -195,7 +195,7 @@ jobs: needs: build-ios runs-on: macos-26 steps: - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: ios-ipa path: ipa @@ -212,3 +212,20 @@ jobs: xcrun altool --upload-app -t ios -f "$IPA" \ --apiKey "$ASC_KEY_ID" \ --apiIssuer "$ASC_ISSUER_ID" + + release-github: + needs: [publish-android, publish-ios] + if: github.event_name == 'push' + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/download-artifact@v5 + with: + name: android-apk + path: apk + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + files: apk/app-release.apk From 23558b0ae390f8480b2233da07410b5aeaafba09 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 21 May 2026 07:10:57 -0700 Subject: [PATCH 146/235] Add configuration confirmation --- lib/l10n/app_en.arb | 3 ++- lib/main.dart | 32 ++++++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 1958a567..fe04718a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -33,5 +33,6 @@ "startAction": "Start service", "stopAction": "Stop service", "sosAction": "Send SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/main.dart b/lib/main.dart index c622eae6..f9e0b5cf 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,6 +17,7 @@ import 'preferences.dart'; import 'configuration_service.dart'; final messengerKey = GlobalKey(); +final navigatorKey = GlobalKey(); void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -42,8 +43,8 @@ class _MainAppState extends State { @override void initState() { super.initState(); - _initLinks(); WidgetsBinding.instance.addPostFrameCallback((_) async { + await _initLinks(); await rateMyApp.init(); if (mounted && rateMyApp.shouldOpenDialog) { try { @@ -59,17 +60,40 @@ class _MainAppState extends State { final appLinks = AppLinks(); final uri = await appLinks.getInitialLink(); if (uri != null) { - await ConfigurationService.applyUri(uri); + await _handleUri(uri); } - appLinks.uriLinkStream.listen((uri) async { + appLinks.uriLinkStream.listen(_handleUri); + } + + Future _handleUri(Uri uri) async { + final context = navigatorKey.currentContext; + if (context == null) return; + final confirmed = await showDialog( + context: context, + builder: (context) => AlertDialog( + content: Text(AppLocalizations.of(context)!.configurationMessage), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context, false), + child: Text(AppLocalizations.of(context)!.cancelButton), + ), + TextButton( + onPressed: () => Navigator.pop(context, true), + child: Text(AppLocalizations.of(context)!.okButton), + ), + ], + ), + ); + if (confirmed == true) { await ConfigurationService.applyUri(uri); - }); + } } @override Widget build(BuildContext context) { return MaterialApp( scaffoldMessengerKey: messengerKey, + navigatorKey: navigatorKey, localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, theme: ThemeData( From 988505c3b0294257a2069159f1484b0e9c3c46ea Mon Sep 17 00:00:00 2001 From: Traccar Bot Date: Fri, 22 May 2026 13:13:02 +0000 Subject: [PATCH 147/235] Update translations --- lib/l10n/app_ar.arb | 3 ++- lib/l10n/app_ca.arb | 3 ++- lib/l10n/app_cs.arb | 3 ++- lib/l10n/app_de.arb | 3 ++- lib/l10n/app_es.arb | 3 ++- lib/l10n/app_fa.arb | 3 ++- lib/l10n/app_fi.arb | 3 ++- lib/l10n/app_fr.arb | 3 ++- lib/l10n/app_he.arb | 3 ++- lib/l10n/app_id.arb | 3 ++- lib/l10n/app_it.arb | 3 ++- lib/l10n/app_ja.arb | 3 ++- lib/l10n/app_ko.arb | 3 ++- lib/l10n/app_lt.arb | 3 ++- lib/l10n/app_lv.arb | 3 ++- lib/l10n/app_nl.arb | 3 ++- lib/l10n/app_pl.arb | 3 ++- lib/l10n/app_pt.arb | 3 ++- lib/l10n/app_pt_BR.arb | 3 ++- lib/l10n/app_ru.arb | 3 ++- lib/l10n/app_sl.arb | 3 ++- lib/l10n/app_th.arb | 3 ++- lib/l10n/app_tr.arb | 3 ++- lib/l10n/app_uk.arb | 3 ++- lib/l10n/app_zh.arb | 3 ++- lib/l10n/app_zh_TW.arb | 9 +++++---- 26 files changed, 55 insertions(+), 29 deletions(-) diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 0fde6fa1..62b2b400 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -33,5 +33,6 @@ "startAction": "بدء الخدمة", "stopAction": "إيقاف الخدمة", "sosAction": "ارسال استغاثة", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_ca.arb b/lib/l10n/app_ca.arb index 5a497230..286f441f 100644 --- a/lib/l10n/app_ca.arb +++ b/lib/l10n/app_ca.arb @@ -33,5 +33,6 @@ "startAction": "Inicia el servei", "stopAction": "Atura el servei", "sosAction": "Envia SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index 7e067f69..7ca39f50 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -33,5 +33,6 @@ "startAction": "Spustit službu", "stopAction": "Zastavit službu", "sosAction": "Odeslat SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 497e27b3..ebebc5fe 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -33,5 +33,6 @@ "startAction": "Dienst starten", "stopAction": "Dienst stoppen", "sosAction": "SOS senden", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index b2e4486b..71465e2b 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -33,5 +33,6 @@ "startAction": "Iniciar servicio", "stopAction": "Detener servicio", "sosAction": "Enviar SOS", - "disclosureMessage": "Esta aplicación recopila datos de ubicación y actividad en segundo plano y los envía al servidor configurado." + "disclosureMessage": "Esta aplicación recopila datos de ubicación y actividad en segundo plano y los envía al servidor configurado.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_fa.arb b/lib/l10n/app_fa.arb index ba0d621a..c31647d5 100644 --- a/lib/l10n/app_fa.arb +++ b/lib/l10n/app_fa.arb @@ -33,5 +33,6 @@ "startAction": "شروع کار", "stopAction": "توقف کار", "sosAction": "ارسال پیام اضطراری", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 75666b10..acce471d 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -33,5 +33,6 @@ "startAction": "Käynnistä seuranta", "stopAction": "Lopeta seuranta", "sosAction": "Lähetä SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index b620a64e..888467a7 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -33,5 +33,6 @@ "startAction": "Démarrer le service", "stopAction": "Arrêter le service", "sosAction": "Envoyer un SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_he.arb b/lib/l10n/app_he.arb index 8c3ac670..1413bbf6 100644 --- a/lib/l10n/app_he.arb +++ b/lib/l10n/app_he.arb @@ -33,5 +33,6 @@ "startAction": "התחל מעקב", "stopAction": "עצור מעקב", "sosAction": "שלח SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index f5066e73..065816d0 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -33,5 +33,6 @@ "startAction": "Mulai layanan", "stopAction": "Hentikan layanan", "sosAction": "Kirim SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 9e91ad3a..c6a6d0a1 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -33,5 +33,6 @@ "startAction": "Avvia servizio", "stopAction": "Ferma servizio", "sosAction": "Invia SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index fdb1d216..238ab204 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -33,5 +33,6 @@ "startAction": "サービス開始", "stopAction": "サービス停止", "sosAction": "SOSを送信", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index c13b0d22..59590a47 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -33,5 +33,6 @@ "startAction": "서비스 시작", "stopAction": "서비스 중지", "sosAction": "SOS 전송", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_lt.arb b/lib/l10n/app_lt.arb index 98c693dc..4fcdef66 100644 --- a/lib/l10n/app_lt.arb +++ b/lib/l10n/app_lt.arb @@ -33,5 +33,6 @@ "startAction": "Įjungti servisą", "stopAction": "Sustabdyti servisą", "sosAction": "Siųsti SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_lv.arb b/lib/l10n/app_lv.arb index c20554a2..dfb90875 100644 --- a/lib/l10n/app_lv.arb +++ b/lib/l10n/app_lv.arb @@ -33,5 +33,6 @@ "startAction": "Startēt servisu", "stopAction": "Apturēt servisu", "sosAction": "Sūtīt SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index af409387..0eedfbb3 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -33,5 +33,6 @@ "startAction": "Service starten", "stopAction": "Service stoppen", "sosAction": "SOS verzenden", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index a9df5c23..f4bb8f8f 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -33,5 +33,6 @@ "startAction": "Uruchom usługę", "stopAction": "Zatrzymaj usługę", "sosAction": "Wyślij SOS", - "disclosureMessage": "Ta aplikacja zbiera w tle dane dotyczące lokalizacji i aktywności i wysyła je na skonfigurowany serwer." + "disclosureMessage": "Ta aplikacja zbiera w tle dane dotyczące lokalizacji i aktywności i wysyła je na skonfigurowany serwer.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 7d2506c1..9d64c9af 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -33,5 +33,6 @@ "startAction": "Iniciar serviço", "stopAction": "Parar serviço", "sosAction": "Enviar SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb index 68b00dd2..0a04830a 100644 --- a/lib/l10n/app_pt_BR.arb +++ b/lib/l10n/app_pt_BR.arb @@ -33,5 +33,6 @@ "startAction": "Iniciar serviço", "stopAction": "Parar serviço", "sosAction": "Enviar SOS", - "disclosureMessage": "Este aplicativo coleta dados de localização e atividade em segundo plano e os envia para o servidor configurado." + "disclosureMessage": "Este aplicativo coleta dados de localização e atividade em segundo plano e os envia para o servidor configurado.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 093b30e2..92066941 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -33,5 +33,6 @@ "startAction": "Запустить сервис", "stopAction": "Остановить сервис", "sosAction": "Отправить SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index 0f3381c8..1a35cb1f 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -33,5 +33,6 @@ "startAction": "Zaženi storitev", "stopAction": "Ustavi storitev", "sosAction": "Pošlji SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index 45bfb1ce..0ccf1caf 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -33,5 +33,6 @@ "startAction": "เริ่มต้นบริการ", "stopAction": "หยุดบริการ", "sosAction": "ส่ง SOS", - "disclosureMessage": "แอปนี้จะรวบรวมข้อมูลตำแหน่งที่ตั้งและกิจกรรมต่างๆ ในเบื้องหลัง และส่งไปยังเซิร์ฟเวอร์ที่ตั้งค่าไว้" + "disclosureMessage": "แอปนี้จะรวบรวมข้อมูลตำแหน่งที่ตั้งและกิจกรรมต่างๆ ในเบื้องหลัง และส่งไปยังเซิร์ฟเวอร์ที่ตั้งค่าไว้", + "configurationMessage": "ใช้การกำหนดค่าใหม่ใช่ไหม" } diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index b4d2213b..3347f583 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -33,5 +33,6 @@ "startAction": "Servisi başlat", "stopAction": "Servisi durdur", "sosAction": "SOS gönder", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index ecde7ad9..4b0f7ba1 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -33,5 +33,6 @@ "startAction": "Запустити сервіс", "stopAction": "Зупинити сервіс", "sosAction": "Відправити SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server." + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index a25bad15..b10f2068 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -33,5 +33,6 @@ "startAction": "启动服务", "stopAction": "停止服务", "sosAction": "发送求救信号", - "disclosureMessage": "该应用会在后台收集位置和活动数据,并将其发送到配置的服务器。" + "disclosureMessage": "该应用会在后台收集位置和活动数据,并将其发送到配置的服务器。", + "configurationMessage": "Apply new configuration?" } diff --git a/lib/l10n/app_zh_TW.arb b/lib/l10n/app_zh_TW.arb index ec6dadec..63f5af4b 100644 --- a/lib/l10n/app_zh_TW.arb +++ b/lib/l10n/app_zh_TW.arb @@ -11,7 +11,7 @@ "invalidValue": "無效資料", "disabledValue": "已停用", "idLabel": "設備識別碼", - "urlLabel": "服務器地址", + "urlLabel": "伺服器地址", "accuracyLabel": "位置精度", "highestAccuracyLabel": "最高", "highAccuracyLabel": "高", @@ -30,8 +30,9 @@ "passwordLabel": "密碼", "optimizationMessage": "為確保追蹤的可靠性,請停用此應用程式的電池優化功能。", "passwordError": "密碼錯誤", - "startAction": "啟動服務", + "startAction": "開始服務", "stopAction": "停止服務", - "sosAction": "發送SOS求救", - "disclosureMessage": "該應用程式會在背景收集位置和活動數據,並將其傳送到配置的伺服器。" + "sosAction": "發送 SOS 求救", + "disclosureMessage": "該應用程式會在背景收集位置和活動數據,並將其傳送到配置的伺服器。", + "configurationMessage": "Apply new configuration?" } From e75baaac1e2b4be2e91207aa5f1c1b92d3200970 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 22 May 2026 06:14:26 -0700 Subject: [PATCH 148/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2d53583b..df8173a3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 9.7.19+136 +version: 9.7.20+137 environment: sdk: ^3.7.2 From 65d52420736b4deaaa5cbaa6c729520fe5b09bc6 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 30 May 2026 16:55:12 -0700 Subject: [PATCH 149/235] Migrate to our own SDK --- android/app/build.gradle.kts | 5 +- lib/configuration_service.dart | 7 +- lib/geolocation_service.dart | 134 ++------------------------------- lib/location_cache.dart | 51 ------------- lib/main.dart | 2 - lib/main_screen.dart | 119 +++++++++-------------------- lib/preferences.dart | 126 +++++-------------------------- lib/push_service.dart | 27 +++---- lib/quick_actions.dart | 15 ++-- lib/settings_screen.dart | 28 ++----- lib/status_screen.dart | 34 ++++----- pubspec.yaml | 4 +- 12 files changed, 107 insertions(+), 445 deletions(-) delete mode 100644 lib/location_cache.dart diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index deb797b1..8974319d 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -12,9 +12,6 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } -val backgroundGeolocation = project(":flutter_background_geolocation") -apply { from("${backgroundGeolocation.projectDir}/background_geolocation.gradle") } - val keystoreProperties = Properties() val keystorePropertiesFile = rootProject.file("../../environment/key.properties") if (keystorePropertiesFile.exists()) { @@ -39,7 +36,7 @@ android { applicationId = "org.traccar.client" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion + minSdk = 24 targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName diff --git a/lib/configuration_service.dart b/lib/configuration_service.dart index 572b0ad1..4fbf8cd6 100644 --- a/lib/configuration_service.dart +++ b/lib/configuration_service.dart @@ -1,5 +1,4 @@ -import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; - +import 'geolocation_service.dart'; import 'preferences.dart'; class ConfigurationService { @@ -18,12 +17,10 @@ class ConfigurationService { await _applyIntParameter(parameters, Preferences.distance); await _applyIntParameter(parameters, Preferences.interval); await _applyIntParameter(parameters, Preferences.angle); - await _applyIntParameter(parameters, Preferences.heartbeat); - await _applyIntParameter(parameters, Preferences.fastestInterval); await _applyBoolParameter(parameters, Preferences.buffer); await _applyBoolParameter(parameters, Preferences.wakelock); await _applyBoolParameter(parameters, Preferences.stopDetection); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); + await GeolocationService.restartIfTracking(); } static Future _applyStringParameter( diff --git a/lib/geolocation_service.dart b/lib/geolocation_service.dart index 9a76eb5a..6138b2d5 100644 --- a/lib/geolocation_service.dart +++ b/lib/geolocation_service.dart @@ -1,134 +1,14 @@ +import 'package:traccar_client_sdk/traccar_client_sdk.dart'; -import 'dart:developer' as developer; -import 'dart:io'; -import 'dart:math'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; -import 'package:traccar_client/location_cache.dart'; -import 'package:traccar_client/preferences.dart'; -import 'package:wakelock_partial_android/wakelock_partial_android.dart'; +import 'preferences.dart'; class GeolocationService { - static Future init() async { - await bg.BackgroundGeolocation.ready(Preferences.geolocationConfig(false)); - if (Platform.isAndroid) { - await bg.BackgroundGeolocation.registerHeadlessTask(headlessTask); - } - FirebaseCrashlytics.instance.log('geolocation_init'); - bg.BackgroundGeolocation.onEnabledChange(onEnabledChange); - bg.BackgroundGeolocation.onMotionChange(onMotionChange); - bg.BackgroundGeolocation.onHeartbeat(onHeartbeat); - bg.BackgroundGeolocation.onLocation(onLocation, (bg.LocationError error) { - developer.log('Location error', error: error); - }); - } - - static Future onEnabledChange(bool enabled) async { - FirebaseCrashlytics.instance.log('geolocation_enabled:$enabled'); - if (Preferences.instance.getBool(Preferences.wakelock) ?? false) { - if (!enabled) { - await WakelockPartialAndroid.release(); - } - } - } - - static Future onMotionChange(bg.Location location) async { - FirebaseCrashlytics.instance.log('geolocation_motion:${location.isMoving}'); - if (Preferences.instance.getBool(Preferences.wakelock) ?? false) { - if (location.isMoving) { - await WakelockPartialAndroid.acquire(); - } else { - await WakelockPartialAndroid.release(); - } - } - } - - static Future onHeartbeat(bg.HeartbeatEvent event) async { - await bg.BackgroundGeolocation.getCurrentPosition(samples: 1, persist: true, extras: {'heartbeat': true}); - } + static final tracker = TraccarClientSdk(); - static Future onLocation(bg.Location location) async { - if (_shouldDelete(location)) { - try { - await bg.BackgroundGeolocation.destroyLocation(location.uuid); - } catch(error) { - developer.log('Failed to delete location', error: error); - } - } else { - LocationCache.set(location); - try { - await bg.BackgroundGeolocation.sync(); - } catch (error) { - developer.log('Failed to send location', error: error); - } + static Future restartIfTracking() async { + if (await tracker.isTracking()) { + await tracker.stop(); + await tracker.start(Preferences.buildConfig()); } } - - static bool _shouldDelete(bg.Location location) { - if (!location.isMoving) return false; - if (location.extras?.isNotEmpty == true) return false; - - final lastLocation = LocationCache.get(); - if (lastLocation == null) return false; - - final isHighestAccuracy = Preferences.instance.getString(Preferences.accuracy) == 'highest'; - final duration = DateTime.parse(location.timestamp).difference(DateTime.parse(lastLocation.timestamp)).inSeconds; - - if (!isHighestAccuracy) { - final fastestInterval = Preferences.instance.getInt(Preferences.fastestInterval); - if (fastestInterval != null && duration < fastestInterval) return true; - } - - final distance = _distance(lastLocation, location); - - final distanceFilter = Preferences.instance.getInt(Preferences.distance) ?? 0; - if (distanceFilter > 0 && distance >= distanceFilter) return false; - - if (distanceFilter == 0 || isHighestAccuracy) { - final intervalFilter = Preferences.instance.getInt(Preferences.interval) ?? 0; - if (intervalFilter > 0 && duration >= intervalFilter) return false; - } - - if (isHighestAccuracy && lastLocation.heading >= 0 && location.coords.heading > 0) { - final angle = (location.coords.heading - lastLocation.heading).abs(); - final angleFilter = Preferences.instance.getInt(Preferences.angle) ?? 0; - if (angleFilter > 0 && angle >= angleFilter) return false; - } - - return true; - } - - static double _distance(Location from, bg.Location to) { - const earthRadius = 6371008.8; // meters - final dLat = _degToRad(to.coords.latitude - from.latitude); - final dLon = _degToRad(to.coords.longitude - from.longitude); - final sinLat = sin(dLat / 2); - final sinLon = sin(dLon / 2); - final a = sinLat * sinLat + cos(_degToRad(from.latitude)) * cos(_degToRad(to.coords.latitude)) * sinLon * sinLon; - final c = 2 * atan2(sqrt(a), sqrt(1 - a)); - return earthRadius * c; - } - - static double _degToRad(double degree) => degree * pi / 180.0; -} - -Future? _firebaseInitialization; - -@pragma('vm:entry-point') -void headlessTask(bg.HeadlessEvent headlessEvent) async { - await (_firebaseInitialization ??= Firebase.initializeApp()); - await Preferences.init(); - FirebaseCrashlytics.instance.log('geolocation_headless:${headlessEvent.name}'); - switch (headlessEvent.name) { - case bg.Event.ENABLEDCHANGE: - await GeolocationService.onEnabledChange(headlessEvent.event); - case bg.Event.MOTIONCHANGE: - await GeolocationService.onMotionChange(headlessEvent.event); - case bg.Event.HEARTBEAT: - await GeolocationService.onHeartbeat(headlessEvent.event); - case bg.Event.LOCATION: - await GeolocationService.onLocation(headlessEvent.event); - } } diff --git a/lib/location_cache.dart b/lib/location_cache.dart deleted file mode 100644 index 53279cf5..00000000 --- a/lib/location_cache.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; -import 'package:traccar_client/preferences.dart'; - -class Location { - final String timestamp; - final double latitude; - final double longitude; - final double heading; - const Location({ - required this.timestamp, - required this.latitude, - required this.longitude, - required this.heading, - }); -} - -class LocationCache { - static Location? _last; - - static Location? get() { - if (_last == null) { - final timestamp = Preferences.instance.getString(Preferences.lastTimestamp); - final latitude = Preferences.instance.getDouble(Preferences.lastLatitude); - final longitude = Preferences.instance.getDouble(Preferences.lastLongitude); - final heading = Preferences.instance.getDouble(Preferences.lastHeading); - if (timestamp != null && latitude != null && longitude != null && heading != null) { - _last = Location( - timestamp: timestamp, - latitude: latitude, - longitude: longitude, - heading: heading, - ); - } - } - return _last; - } - - static Future set(bg.Location location) async { - final last = Location( - timestamp: location.timestamp, - latitude: location.coords.latitude, - longitude: location.coords.longitude, - heading: location.coords.heading, - ); - Preferences.instance.setString(Preferences.lastTimestamp, last.timestamp); - Preferences.instance.setDouble(Preferences.lastLatitude, last.latitude); - Preferences.instance.setDouble(Preferences.lastLongitude, last.longitude); - Preferences.instance.setDouble(Preferences.lastHeading, last.heading); - _last = last; - } -} diff --git a/lib/main.dart b/lib/main.dart index f9e0b5cf..868c5216 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,7 +6,6 @@ import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; import 'package:app_links/app_links.dart'; import 'package:rate_my_app/rate_my_app.dart'; -import 'package:traccar_client/geolocation_service.dart'; import 'package:traccar_client/password_service.dart'; import 'package:traccar_client/push_service.dart'; import 'package:traccar_client/quick_actions.dart'; @@ -25,7 +24,6 @@ void main() async { FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; await Preferences.init(); await PasswordService.migrate(); - await GeolocationService.init(); await PushService.init(); runApp(const MainApp()); } diff --git a/lib/main_screen.dart b/lib/main_screen.dart index b088f001..82da4b73 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -1,17 +1,15 @@ import 'dart:io'; -import 'package:app_settings/app_settings.dart'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:traccar_client/main.dart'; import 'package:traccar_client/password_service.dart'; import 'package:traccar_client/preferences.dart'; -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; +import 'geolocation_service.dart'; import 'l10n/app_localizations.dart'; -import 'status_screen.dart'; import 'settings_screen.dart'; +import 'status_screen.dart'; class MainScreen extends StatefulWidget { const MainScreen({super.key}); @@ -20,62 +18,37 @@ class MainScreen extends StatefulWidget { State createState() => _MainScreenState(); } -class _MainScreenState extends State { +class _MainScreenState extends State with WidgetsBindingObserver { bool trackingEnabled = false; - bool? isMoving; @override void initState() { super.initState(); - _initState(); + WidgetsBinding.instance.addObserver(this); + _refreshState(); } - void _initState() async { - final state = await bg.BackgroundGeolocation.state; - setState(() { - trackingEnabled = state.enabled; - isMoving = state.isMoving; - }); - bg.BackgroundGeolocation.onEnabledChange((bool enabled) { - setState(() { - trackingEnabled = enabled; - }); - }); - bg.BackgroundGeolocation.onMotionChange((bg.Location location) { - setState(() { - isMoving = location.isMoving; - }); - }); + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); } - Future _checkBatteryOptimizations(BuildContext context) async { - try { - if (!await bg.DeviceSettings.isIgnoringBatteryOptimizations) { - final request = await bg.DeviceSettings.showIgnoreBatteryOptimizations(); - if (!request.seen && context.mounted) { - showDialog( - context: context, - builder: (_) => AlertDialog( - scrollable: true, - content: Text(AppLocalizations.of(context)!.optimizationMessage), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - bg.DeviceSettings.show(request); - }, - child: Text(AppLocalizations.of(context)!.okButton), - ), - ], - ), - ); - } - } - } catch (error) { - debugPrint(error.toString()); + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + _refreshState(); } } + Future _refreshState() async { + final tracking = await GeolocationService.tracker.isTracking(); + if (!mounted) return; + setState(() { + trackingEnabled = tracking; + }); + } + Widget _buildTrackingCard() { return Card( child: Padding( @@ -104,39 +77,25 @@ class _MainScreenState extends State { contentPadding: EdgeInsets.zero, title: Text(AppLocalizations.of(context)!.trackingLabel), value: trackingEnabled, - activeTrackColor: isMoving == false ? Theme.of(context).colorScheme.secondary : null, onChanged: (bool value) async { if (await PasswordService.authenticate(context) && mounted) { if (value) { - try { - FirebaseCrashlytics.instance.log('tracking_toggle_start'); - await bg.BackgroundGeolocation.start(); - if (mounted) { - _checkBatteryOptimizations(context); - } - } on PlatformException catch (error) { - 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( - 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, - ), - ); + FirebaseCrashlytics.instance.log('tracking_toggle_start'); + final started = await GeolocationService.tracker.start(Preferences.buildConfig()); + if (!mounted) return; + if (!started) { + messengerKey.currentState?.showSnackBar( + const SnackBar( + content: Text('Failed to start tracking. Check location permissions.'), + duration: Duration(seconds: 4), + ), + ); } + setState(() => trackingEnabled = started); } else { FirebaseCrashlytics.instance.log('tracking_toggle_stop'); - bg.BackgroundGeolocation.stop(); + await GeolocationService.tracker.stop(); + if (mounted) setState(() => trackingEnabled = false); } } }, @@ -147,11 +106,7 @@ class _MainScreenState extends State { children: [ FilledButton.tonal( onPressed: () async { - try { - await bg.BackgroundGeolocation.getCurrentPosition(samples: 1, persist: true, extras: {'manual': true}); - } on PlatformException catch (error) { - messengerKey.currentState?.showSnackBar(SnackBar(content: Text(error.message ?? error.code))); - } + await GeolocationService.tracker.requestPosition(Preferences.buildConfig()); }, child: Text(AppLocalizations.of(context)!.locationButton), ), @@ -211,7 +166,7 @@ class _MainScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('Traccar Client'), + title: const Text('Traccar Client'), ), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), diff --git a/lib/preferences.dart b/lib/preferences.dart index 6864432a..bf26bdbf 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -1,9 +1,9 @@ import 'dart:io'; import 'dart:math'; -import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences_android/shared_preferences_android.dart'; +import 'package:traccar_client_sdk/traccar_client_sdk.dart'; class Preferences { static Future? _initFuture; @@ -15,18 +15,11 @@ class Preferences { static const String distance = 'distance'; static const String interval = 'interval'; static const String angle = 'angle'; - static const String heartbeat = 'heartbeat'; - static const String fastestInterval = 'fastest_interval'; static const String buffer = 'buffer'; static const String wakelock = 'wakelock'; static const String stopDetection = 'stop_detection'; static const String password = 'password'; - static const String lastTimestamp = 'lastTimestamp'; - static const String lastLatitude = 'lastLatitude'; - static const String lastLongitude = 'lastLongitude'; - static const String lastHeading = 'lastHeading'; - static Future init() async { _initFuture ??= _createInstance(); await _initFuture; @@ -35,13 +28,11 @@ class Preferences { static Future _createInstance() async { instance = await SharedPreferencesWithCache.create( sharedPreferencesOptions: Platform.isAndroid - ? SharedPreferencesAsyncAndroidOptions(backend: SharedPreferencesAndroidBackendLibrary.SharedPreferences) - : SharedPreferencesOptions(), + ? SharedPreferencesAsyncAndroidOptions(backend: SharedPreferencesAndroidBackendLibrary.SharedPreferences) + : SharedPreferencesOptions(), cacheOptions: SharedPreferencesWithCacheOptions( allowList: { - id, url, accuracy, distance, interval, angle, heartbeat, - fastestInterval, buffer, wakelock, stopDetection, password, - lastTimestamp, lastLatitude, lastLongitude, lastHeading, + id, url, accuracy, distance, interval, angle, buffer, wakelock, stopDetection, password, }, ), ); @@ -53,104 +44,27 @@ class Preferences { await instance.setInt(distance, 75); await instance.setBool(buffer, true); await instance.setBool(stopDetection, true); - await instance.setInt(fastestInterval, 30); } } - static bg.Config geolocationConfig(bool reset) { - final isHighestAccuracy = instance.getString(accuracy) == 'highest'; - final locationUpdateInterval = (instance.getInt(interval) ?? 0) * 1000; - final fastestLocationUpdateInterval = (instance.getInt(fastestInterval) ?? 30) * 1000; - final heartbeatInterval = instance.getInt(heartbeat) ?? 0; - return bg.Config( - reset: reset, - geolocation: bg.GeoConfig( - desiredAccuracy: switch (instance.getString(accuracy)) { - 'highest' => Platform.isIOS ? bg.DesiredAccuracy.navigation : bg.DesiredAccuracy.high, - 'high' => bg.DesiredAccuracy.high, - 'low' => bg.DesiredAccuracy.low, - _ => bg.DesiredAccuracy.medium, - }, - distanceFilter: isHighestAccuracy ? 0 : instance.getInt(distance)?.toDouble(), - locationUpdateInterval: Platform.isAndroid - ? (isHighestAccuracy ? 0 : (locationUpdateInterval > 0 ? locationUpdateInterval : null)) - : null, - fastestLocationUpdateInterval: Platform.isAndroid ? (isHighestAccuracy ? 0 : fastestLocationUpdateInterval) : null, - disableElasticity: true, - pausesLocationUpdatesAutomatically: Platform.isIOS ? !(isHighestAccuracy || instance.getBool(stopDetection) == false) : null, - showsBackgroundLocationIndicator: Platform.isIOS ? false : null, - ), - app: bg.AppConfig( - enableHeadless: Platform.isAndroid ? true : null, - stopOnTerminate: false, - startOnBoot: true, - heartbeatInterval: heartbeatInterval > 0 ? heartbeatInterval.toDouble() : null, - preventSuspend: Platform.isIOS ? (heartbeatInterval > 0) : null, - backgroundPermissionRationale: Platform.isAndroid - ? bg.PermissionRationale( - title: 'Allow {applicationName} to access this device\'s location in the background', - message: 'For reliable tracking, please enable {backgroundPermissionOptionLabel} location access.', - positiveAction: 'Change to {backgroundPermissionOptionLabel}', - negativeAction: 'Cancel') - : null, - notification: Platform.isAndroid - ? bg.Notification( - smallIcon: 'drawable/ic_stat_notify', - priority: bg.NotificationPriority.low, - ) - : null, - ), - http: bg.HttpConfig( - autoSync: false, - url: _formatUrl(instance.getString(url)), - params: { - 'device_id': instance.getString(id), + static Config buildConfig() { + return Config( + serverUrl: instance.getString(url) ?? '', + deviceId: instance.getString(id) ?? '', + location: LocationConfig( + accuracy: switch (instance.getString(accuracy)) { + 'highest' => Accuracy.highest, + 'high' => Accuracy.high, + 'low' => Accuracy.low, + _ => Accuracy.medium, }, + distanceMeters: instance.getInt(distance) ?? 75, + intervalSeconds: instance.getInt(interval) ?? 300, + angleDegrees: instance.getInt(angle) ?? 0, + stopDetection: instance.getBool(stopDetection) ?? true, ), - logger: const bg.LoggerConfig( - logLevel: bg.LogLevel.verbose, - logMaxDays: 1, - ), - activity: bg.ActivityConfig( - disableStopDetection: instance.getBool(stopDetection) == false, - ), - persistence: bg.PersistenceConfig( - maxRecordsToPersist: instance.getBool(buffer) != false ? -1 : 1, - locationTemplate: _locationTemplate(), - ), + wakeLock: instance.getBool(wakelock) ?? false, + buffer: instance.getBool(buffer) ?? true, ); } - - static String? _formatUrl(String? url) { - if (url == null) return null; - final uri = Uri.parse(url); - if ((uri.path.isEmpty || uri.path == '') && !url.endsWith('/')) return '$url/'; - return url; - } - - static String _locationTemplate() { - return '''{ - "timestamp": "<%= timestamp %>", - "coords": { - "latitude": <%= latitude %>, - "longitude": <%= longitude %>, - "accuracy": <%= accuracy %>, - "speed": <%= speed %>, - "heading": <%= heading %>, - "altitude": <%= altitude %> - }, - "is_moving": <%= is_moving %>, - "odometer": <%= odometer %>, - "event": "<%= event %>", - "battery": { - "level": <%= battery.level %>, - "is_charging": <%= battery.is_charging %> - }, - "activity": { - "type": "<%= activity.type %>" - }, - "extras": {}, - "_": "&id=${instance.getString(id)}&lat=<%= latitude %>&lon=<%= longitude %>×tamp=<%= timestamp %>&" - }'''.split('\n').map((line) => line.trimLeft()).join(); - } } diff --git a/lib/push_service.dart b/lib/push_service.dart index 66508d5d..add379fd 100644 --- a/lib/push_service.dart +++ b/lib/push_service.dart @@ -4,9 +4,9 @@ import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; import 'package:traccar_client/password_service.dart'; +import 'geolocation_service.dart'; import 'preferences.dart'; class PushService { @@ -15,15 +15,11 @@ class PushService { FirebaseMessaging.onBackgroundMessage(pushServiceBackgroundHandler); FirebaseMessaging.onMessage.listen(_onMessage); FirebaseMessaging.instance.onTokenRefresh.listen(_uploadToken); - bg.BackgroundGeolocation.onEnabledChange((enabled) async { - if (enabled) { - try { - _uploadToken(await FirebaseMessaging.instance.getToken()); - } catch (error) { - developer.log('Failed to get notificaion token', error: error); - } - } - }); + try { + await _uploadToken(await FirebaseMessaging.instance.getToken()); + } catch (error) { + developer.log('Failed to get notification token', error: error); + } } static Future _onMessage(RemoteMessage message) async { @@ -31,15 +27,11 @@ class PushService { FirebaseCrashlytics.instance.log('push_command: $command'); switch (command) { case 'positionSingle': - try { - await bg.BackgroundGeolocation.getCurrentPosition(samples: 1, persist: true, extras: {'remote': true}); - } catch (error) { - developer.log('Failed to get position', error: error); - } + await GeolocationService.tracker.requestPosition(Preferences.buildConfig()); case 'positionPeriodic': - await bg.BackgroundGeolocation.start(); + await GeolocationService.tracker.start(Preferences.buildConfig()); case 'positionStop': - await bg.BackgroundGeolocation.stop(); + await GeolocationService.tracker.stop(); case 'factoryReset': await PasswordService.setPassword(''); } @@ -65,7 +57,6 @@ class PushService { Future pushServiceBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(); await Preferences.init(); - await bg.BackgroundGeolocation.ready(Preferences.geolocationConfig(false)); FirebaseCrashlytics.instance.log('push_background_handler'); await PushService._onMessage(message); } diff --git a/lib/quick_actions.dart b/lib/quick_actions.dart index 6cf86ddf..77b7ab10 100644 --- a/lib/quick_actions.dart +++ b/lib/quick_actions.dart @@ -1,12 +1,11 @@ -import 'dart:developer' as developer; - import 'package:firebase_crashlytics/firebase_crashlytics.dart'; 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 'geolocation_service.dart'; import 'l10n/app_localizations.dart'; +import 'preferences.dart'; class QuickActionsInitializer extends StatefulWidget { const QuickActionsInitializer({super.key}); @@ -25,15 +24,11 @@ class _QuickActionsInitializerState extends State { FirebaseCrashlytics.instance.log('quick_action: $shortcutType'); switch (shortcutType) { case 'start': - await bg.BackgroundGeolocation.start(); + await GeolocationService.tracker.start(Preferences.buildConfig()); case 'stop': - await bg.BackgroundGeolocation.stop(); + await GeolocationService.tracker.stop(); case 'sos': - try { - await bg.BackgroundGeolocation.getCurrentPosition(samples: 1, persist: true, extras: {'alarm': 'sos'}); - } catch (error) { - developer.log('Failed to send alert', error: error); - } + await GeolocationService.tracker.requestPosition(Preferences.buildConfig()); } if (mounted) { FirebaseCrashlytics.instance.log('quick_action_exit'); diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index c770ffdc..ccc8480e 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -2,12 +2,11 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; import 'package:traccar_client/main.dart'; import 'package:traccar_client/password_service.dart'; import 'package:traccar_client/qr_code_screen.dart'; -import 'package:wakelock_partial_android/wakelock_partial_android.dart'; +import 'geolocation_service.dart'; import 'l10n/app_localizations.dart'; import 'preferences.dart'; @@ -70,17 +69,14 @@ class _SettingsScreenState extends State { } } if (isInt) { - int? intValue = int.tryParse(result); + final intValue = int.tryParse(result); if (intValue != null) { - if (key == Preferences.heartbeat && intValue > 0 && intValue < 60) { - intValue = 60; // minimum heartbeat is 60 seconds - } await Preferences.instance.setInt(key, intValue); } } else { await Preferences.instance.setString(key, result); } - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); + await GeolocationService.restartIfTracking(); setState(() {}); } } @@ -150,7 +146,7 @@ class _SettingsScreenState extends State { ); if (selectedAccuracy != null) { await Preferences.instance.setString(Preferences.accuracy, selectedAccuracy); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); + await GeolocationService.restartIfTracking(); setState(() {}); } }, @@ -184,7 +180,6 @@ class _SettingsScreenState extends State { _buildListTile(AppLocalizations.of(context)!.intervalLabel, Preferences.interval, true), if (isHighestAccuracy) _buildListTile(AppLocalizations.of(context)!.angleLabel, Preferences.angle, true), - _buildListTile(AppLocalizations.of(context)!.heartbeatLabel, Preferences.heartbeat, true), SwitchListTile( title: Text(AppLocalizations.of(context)!.advancedLabel), value: advanced, @@ -192,15 +187,13 @@ class _SettingsScreenState extends State { setState(() => advanced = value); }, ), - if (advanced) - _buildListTile(AppLocalizations.of(context)!.fastestIntervalLabel, Preferences.fastestInterval, true), if (advanced) SwitchListTile( title: Text(AppLocalizations.of(context)!.bufferLabel), value: Preferences.instance.getBool(Preferences.buffer) ?? true, onChanged: (value) async { await Preferences.instance.setBool(Preferences.buffer, value); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); + await GeolocationService.restartIfTracking(); setState(() {}); }, ), @@ -210,14 +203,7 @@ class _SettingsScreenState extends State { value: Preferences.instance.getBool(Preferences.wakelock) ?? false, onChanged: (value) async { await Preferences.instance.setBool(Preferences.wakelock, value); - if (value) { - final state = await bg.BackgroundGeolocation.state; - if (state.isMoving == true) { - WakelockPartialAndroid.acquire(); - } - } else { - WakelockPartialAndroid.release(); - } + await GeolocationService.restartIfTracking(); setState(() {}); }, ), @@ -227,7 +213,7 @@ class _SettingsScreenState extends State { value: Preferences.instance.getBool(Preferences.stopDetection) ?? true, onChanged: (value) async { await Preferences.instance.setBool(Preferences.stopDetection, value); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(true)); + await GeolocationService.restartIfTracking(); setState(() {}); }, ), diff --git a/lib/status_screen.dart b/lib/status_screen.dart index abb3c2dc..630ee7c2 100644 --- a/lib/status_screen.dart +++ b/lib/status_screen.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; +import 'package:share_plus/share_plus.dart'; +import 'package:traccar_client_sdk/traccar_client_sdk.dart'; +import 'geolocation_service.dart'; import 'l10n/app_localizations.dart'; class StatusScreen extends StatefulWidget { @@ -11,7 +13,7 @@ class StatusScreen extends StatefulWidget { } class _StatusScreenState extends State { - final List _logs = []; + List _logs = const []; @override void initState() { @@ -20,26 +22,24 @@ class _StatusScreenState extends State { } Future _refreshLogs() async { - final logs = await bg.Logger.getLog(bg.SQLQuery( - order: bg.SQLQuery.ORDER_DESC, - limit: 2000, - )); + final logs = await GeolocationService.tracker.getLogs(); setState(() { - _logs.clear(); - _logs.addAll(logs.split('\n')); + _logs = logs.reversed.map(_format).toList(growable: false); }); } - Future _emailLogs() async { - await bg.Logger.emailLog("support@traccar.org", bg.SQLQuery( - order: bg.SQLQuery.ORDER_DESC, - limit: 25000, - )); + Future _shareLogs() async { + await SharePlus.instance.share(ShareParams(text: _logs.reversed.join('\n'))); } Future _clearLogs() async { - await bg.Logger.destroyLog(); - setState(() => _logs.clear()); + await GeolocationService.tracker.clearLogs(); + setState(() => _logs = const []); + } + + static String _format(LogEntry entry) { + final time = DateTime.fromMillisecondsSinceEpoch(entry.time).toIso8601String(); + return '$time ${entry.message}'; } @override @@ -54,7 +54,7 @@ class _StatusScreenState extends State { ), IconButton( icon: const Icon(Icons.share), - onPressed: _emailLogs, + onPressed: _shareLogs, ), IconButton( icon: const Icon(Icons.delete), @@ -69,7 +69,7 @@ class _StatusScreenState extends State { padding: const EdgeInsets.symmetric(horizontal: 8.0), child: Text( _logs[index], - style: TextStyle( + style: const TextStyle( fontSize: 10, fontFamily: 'monospace', ), diff --git a/pubspec.yaml b/pubspec.yaml index df8173a3..9281846b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - flutter_background_geolocation: ^5.2.0 + traccar_client_sdk: ^0.0.8 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 @@ -21,11 +21,11 @@ dependencies: quick_actions: ^1.1.0 rate_my_app: ^2.4.0 shared_preferences_android: ^2.4.23 - wakelock_partial_android: ^1.0.1 mobile_scanner: ^7.2.0 flutter_secure_storage: ^10.2.0 app_links: ^7.0.0 app_settings: ^7.0.0 + share_plus: ^11.1.0 dev_dependencies: flutter_test: From aa374807218326f3464405f08f1d652544d6243d Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 30 May 2026 17:13:49 -0700 Subject: [PATCH 150/235] Update iOS project --- ios/Runner.xcodeproj/project.pbxproj | 36 ----- .../xcshareddata/swiftpm/Package.resolved | 131 ++++++++++++++++++ 2 files changed, 131 insertions(+), 36 deletions(-) create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 90c20c6e..77d8a702 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -212,9 +212,7 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - B103AE670B136CF320D263A0 /* [CP] Embed Pods Frameworks */, 8D2D9F72CCBD33BB3AF0B2DE /* FlutterFire: "flutterfire upload-crashlytics-symbols" */, - A9B1079A9392DD8285EE1EF9 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -365,23 +363,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A9B1079A9392DD8285EE1EF9 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; AAF19D00E31B31B06E129F93 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -404,23 +385,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B103AE670B136CF320D263A0 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..20437e34 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,131 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5", + "version" : "1.2024072200.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "61b85103a1aeed8218f17c794687781505fbbef5", + "version" : "11.2.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "8d5b4189f1f482df8d5c58c9985ea70491ef5382", + "version" : "12.14.0" + } + }, + { + "identity" : "google-ads-on-device-conversion-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk", + "state" : { + "revision" : "9bfcc6cf435b2e7c5562c1900b8680c594fa9a64", + "version" : "3.6.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "219e564a8510e983e675c94f77f7f7c50049f22d", + "version" : "12.14.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", + "version" : "10.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "60da361632d0de02786f709bdc0c4df340f7613e", + "version" : "8.1.0" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6", + "version" : "1.69.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "c0ac7575d70050c2973ba2318bd5af47f8e8153a", + "version" : "5.3.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe", + "version" : "101.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "traccar-client-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/traccar/traccar-client-sdk.git", + "state" : { + "revision" : "f2deee5c0f67de546e77b1d66716b8a1d19396f7", + "version" : "0.0.8" + } + } + ], + "version" : 2 +} From 31345529a9f6c9919793ee1341e744d9f16856f2 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 30 May 2026 19:17:58 -0700 Subject: [PATCH 151/235] Fix Siri shortcuts after SDK migration Co-Authored-By: Claude Opus 4.7 (1M context) --- ios/Runner/AppIntents.swift | 16 +++++++++++----- lib/main.dart | 12 +++++++++++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ios/Runner/AppIntents.swift b/ios/Runner/AppIntents.swift index 1a9e920b..76e25af8 100644 --- a/ios/Runner/AppIntents.swift +++ b/ios/Runner/AppIntents.swift @@ -1,14 +1,20 @@ import AppIntents -import TSLocationManager +import UIKit + +@available(iOS 16.0, *) +@MainActor +private func openAction(_ name: String) async { + await UIApplication.shared.open(URL(string: "org.traccar.client://action/\(name)")!) +} @available(iOS 16.0, *) struct StartTrackingIntent: AppIntent { static var title: LocalizedStringResource = "Start Tracking" static var description = IntentDescription("Start continuous location tracking") - static var openAppWhenRun: Bool = false + static var openAppWhenRun: Bool = true func perform() async throws -> some IntentResult { - BackgroundGeolocation.sharedInstance().start() + await openAction("start") return .result() } } @@ -17,10 +23,10 @@ struct StartTrackingIntent: AppIntent { struct StopTrackingIntent: AppIntent { static var title: LocalizedStringResource = "Stop Tracking" static var description = IntentDescription("Stop continuous location tracking") - static var openAppWhenRun: Bool = false + static var openAppWhenRun: Bool = true func perform() async throws -> some IntentResult { - BackgroundGeolocation.sharedInstance().stop() + await openAction("stop") return .result() } } diff --git a/lib/main.dart b/lib/main.dart index 868c5216..a7618f04 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,10 +10,11 @@ import 'package:traccar_client/password_service.dart'; import 'package:traccar_client/push_service.dart'; import 'package:traccar_client/quick_actions.dart'; +import 'configuration_service.dart'; +import 'geolocation_service.dart'; import 'l10n/app_localizations.dart'; import 'main_screen.dart'; import 'preferences.dart'; -import 'configuration_service.dart'; final messengerKey = GlobalKey(); final navigatorKey = GlobalKey(); @@ -64,6 +65,15 @@ class _MainAppState extends State { } Future _handleUri(Uri uri) async { + if (uri.host == 'action') { + switch (uri.pathSegments.firstOrNull) { + case 'start': + await GeolocationService.tracker.start(Preferences.buildConfig()); + case 'stop': + await GeolocationService.tracker.stop(); + } + return; + } final context = navigatorKey.currentContext; if (context == null) return; final confirmed = await showDialog( From 1d935a347f8e7afb9ebbefa023b15f1db8c0e04a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 31 May 2026 14:28:09 -0700 Subject: [PATCH 152/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 9281846b..a53d862b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.8 + traccar_client_sdk: ^0.0.12 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From e60455a701c6eb1907c78f521dd8b6e5c044f204 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 31 May 2026 14:36:48 -0700 Subject: [PATCH 153/235] Improve logs formatting --- lib/status_screen.dart | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/status_screen.dart b/lib/status_screen.dart index 630ee7c2..7163103d 100644 --- a/lib/status_screen.dart +++ b/lib/status_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; import 'package:share_plus/share_plus.dart'; import 'package:traccar_client_sdk/traccar_client_sdk.dart'; @@ -13,7 +14,10 @@ class StatusScreen extends StatefulWidget { } class _StatusScreenState extends State { - List _logs = const []; + static final _displayFormat = DateFormat('HH:mm:ss'); + static final _fullFormat = DateFormat('yyyy-MM-dd HH:mm:ss'); + + List _logs = const []; @override void initState() { @@ -24,12 +28,16 @@ class _StatusScreenState extends State { Future _refreshLogs() async { final logs = await GeolocationService.tracker.getLogs(); setState(() { - _logs = logs.reversed.map(_format).toList(growable: false); + _logs = logs.reversed.toList(growable: false); }); } Future _shareLogs() async { - await SharePlus.instance.share(ShareParams(text: _logs.reversed.join('\n'))); + final text = _logs.reversed.map((entry) { + final t = DateTime.fromMillisecondsSinceEpoch(entry.time); + return '${_fullFormat.format(t)} ${entry.message}'; + }).join('\n'); + await SharePlus.instance.share(ShareParams(text: text)); } Future _clearLogs() async { @@ -37,11 +45,6 @@ class _StatusScreenState extends State { setState(() => _logs = const []); } - static String _format(LogEntry entry) { - final time = DateTime.fromMillisecondsSinceEpoch(entry.time).toIso8601String(); - return '$time ${entry.message}'; - } - @override Widget build(BuildContext context) { return Scaffold( @@ -65,16 +68,20 @@ class _StatusScreenState extends State { body: ListView.builder( reverse: true, itemCount: _logs.length, - itemBuilder: (_, index) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Text( - _logs[index], - style: const TextStyle( - fontSize: 10, - fontFamily: 'monospace', + itemBuilder: (_, index) { + final entry = _logs[index]; + final t = DateTime.fromMillisecondsSinceEpoch(entry.time); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + '${_displayFormat.format(t)} ${entry.message}', + style: const TextStyle( + fontSize: 10, + fontFamily: 'monospace', + ), ), - ), - ), + ); + }, ), ); } From ad5df6314f3d7d1ce84251521633203be1c15863 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 31 May 2026 17:23:25 -0700 Subject: [PATCH 154/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index a53d862b..b5aaf9c8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.12 + traccar_client_sdk: ^0.0.14 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From 2ae3f63cf7eec0de9fd1e311925ad5aeeb35a2c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 31 May 2026 17:24:44 -0700 Subject: [PATCH 155/235] Bump share_plus from 11.1.0 to 13.1.0 (#189) Bumps [share_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/share_plus) from 11.1.0 to 13.1.0. - [Release notes](https://github.com/fluttercommunity/plus_plugins/releases) - [Commits](https://github.com/fluttercommunity/plus_plugins/commits/share_plus-v13.1.0/packages/share_plus) --- updated-dependencies: - dependency-name: share_plus dependency-version: 13.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index b5aaf9c8..9a52492c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: flutter_secure_storage: ^10.2.0 app_links: ^7.0.0 app_settings: ^7.0.0 - share_plus: ^11.1.0 + share_plus: ^13.1.0 dev_dependencies: flutter_test: From 2bdca629aaad224708c1e0c2aaa838d862b536cb Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 31 May 2026 17:26:22 -0700 Subject: [PATCH 156/235] Regularly refresh logs --- lib/status_screen.dart | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/status_screen.dart b/lib/status_screen.dart index 7163103d..445d5e7d 100644 --- a/lib/status_screen.dart +++ b/lib/status_screen.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:share_plus/share_plus.dart'; @@ -18,11 +20,23 @@ class _StatusScreenState extends State { static final _fullFormat = DateFormat('yyyy-MM-dd HH:mm:ss'); List _logs = const []; + Timer? _refreshTimer; @override void initState() { super.initState(); _refreshLogs(); + _refreshTimer = Timer.periodic(const Duration(seconds: 5), (_) { + if (WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed) { + _refreshLogs(); + } + }); + } + + @override + void dispose() { + _refreshTimer?.cancel(); + super.dispose(); } Future _refreshLogs() async { From d95e096d4745420c510910d61948ecc7a65fb8a5 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 19 Jun 2026 12:53:42 -0700 Subject: [PATCH 157/235] Update SDK version --- android/gradle.properties | 2 ++ .../xcshareddata/swiftpm/Package.resolved | 16 ++++++++-------- lib/configuration_service.dart | 2 +- lib/geolocation_service.dart | 9 --------- lib/main.dart | 3 ++- lib/main_screen.dart | 11 +++++++++-- lib/push_service.dart | 5 +++-- lib/quick_actions.dart | 5 ++--- lib/settings_screen.dart | 10 +++++----- pubspec.yaml | 2 +- 10 files changed, 33 insertions(+), 32 deletions(-) diff --git a/android/gradle.properties b/android/gradle.properties index f018a618..5a1481d6 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,5 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true +android.builtInKotlin=false +android.newDsl=false diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 20437e34..ad512f39 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -14,8 +14,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/app-check.git", "state" : { - "revision" : "61b85103a1aeed8218f17c794687781505fbbef5", - "version" : "11.2.0" + "revision" : "bb4002485ff867768dec13bf904a2ddb050bd1b1", + "version" : "11.3.0" } }, { @@ -23,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/firebase/firebase-ios-sdk", "state" : { - "revision" : "8d5b4189f1f482df8d5c58c9985ea70491ef5382", - "version" : "12.14.0" + "revision" : "42e81d245e30e49ea6a5830cf2842d44a1591270", + "version" : "12.15.0" } }, { @@ -41,8 +41,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/GoogleAppMeasurement.git", "state" : { - "revision" : "219e564a8510e983e675c94f77f7f7c50049f22d", - "version" : "12.14.0" + "revision" : "144855f40d8668927f256a3045f7fdc4c3f4338b", + "version" : "12.15.0" } }, { @@ -122,8 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/traccar/traccar-client-sdk.git", "state" : { - "revision" : "f2deee5c0f67de546e77b1d66716b8a1d19396f7", - "version" : "0.0.8" + "revision" : "721d3790f2c50a144d342ef35197184357d389fc", + "version" : "0.0.16" } } ], diff --git a/lib/configuration_service.dart b/lib/configuration_service.dart index 4fbf8cd6..8874a876 100644 --- a/lib/configuration_service.dart +++ b/lib/configuration_service.dart @@ -20,7 +20,7 @@ class ConfigurationService { await _applyBoolParameter(parameters, Preferences.buffer); await _applyBoolParameter(parameters, Preferences.wakelock); await _applyBoolParameter(parameters, Preferences.stopDetection); - await GeolocationService.restartIfTracking(); + await GeolocationService.tracker.setConfig(Preferences.buildConfig()); } static Future _applyStringParameter( diff --git a/lib/geolocation_service.dart b/lib/geolocation_service.dart index 6138b2d5..8afbc035 100644 --- a/lib/geolocation_service.dart +++ b/lib/geolocation_service.dart @@ -1,14 +1,5 @@ import 'package:traccar_client_sdk/traccar_client_sdk.dart'; -import 'preferences.dart'; - class GeolocationService { static final tracker = TraccarClientSdk(); - - static Future restartIfTracking() async { - if (await tracker.isTracking()) { - await tracker.stop(); - await tracker.start(Preferences.buildConfig()); - } - } } diff --git a/lib/main.dart b/lib/main.dart index a7618f04..05f65fc9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -24,6 +24,7 @@ void main() async { await Firebase.initializeApp(); FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; await Preferences.init(); + await GeolocationService.tracker.init(Preferences.buildConfig()); await PasswordService.migrate(); await PushService.init(); runApp(const MainApp()); @@ -68,7 +69,7 @@ class _MainAppState extends State { if (uri.host == 'action') { switch (uri.pathSegments.firstOrNull) { case 'start': - await GeolocationService.tracker.start(Preferences.buildConfig()); + await GeolocationService.tracker.start(); case 'stop': await GeolocationService.tracker.stop(); } diff --git a/lib/main_screen.dart b/lib/main_screen.dart index 82da4b73..5834adfa 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:traccar_client/main.dart'; import 'package:traccar_client/password_service.dart'; import 'package:traccar_client/preferences.dart'; @@ -81,7 +82,13 @@ class _MainScreenState extends State with WidgetsBindingObserver { if (await PasswordService.authenticate(context) && mounted) { if (value) { FirebaseCrashlytics.instance.log('tracking_toggle_start'); - final started = await GeolocationService.tracker.start(Preferences.buildConfig()); + var started = false; + try { + await GeolocationService.tracker.start(); + started = true; + } on PlatformException { + // permission denied or startup error + } if (!mounted) return; if (!started) { messengerKey.currentState?.showSnackBar( @@ -106,7 +113,7 @@ class _MainScreenState extends State with WidgetsBindingObserver { children: [ FilledButton.tonal( onPressed: () async { - await GeolocationService.tracker.requestPosition(Preferences.buildConfig()); + await GeolocationService.tracker.requestPosition(); }, child: Text(AppLocalizations.of(context)!.locationButton), ), diff --git a/lib/push_service.dart b/lib/push_service.dart index add379fd..7af36a8d 100644 --- a/lib/push_service.dart +++ b/lib/push_service.dart @@ -27,9 +27,9 @@ class PushService { FirebaseCrashlytics.instance.log('push_command: $command'); switch (command) { case 'positionSingle': - await GeolocationService.tracker.requestPosition(Preferences.buildConfig()); + await GeolocationService.tracker.requestPosition(); case 'positionPeriodic': - await GeolocationService.tracker.start(Preferences.buildConfig()); + await GeolocationService.tracker.start(); case 'positionStop': await GeolocationService.tracker.stop(); case 'factoryReset': @@ -57,6 +57,7 @@ class PushService { Future pushServiceBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(); await Preferences.init(); + await GeolocationService.tracker.init(Preferences.buildConfig()); FirebaseCrashlytics.instance.log('push_background_handler'); await PushService._onMessage(message); } diff --git a/lib/quick_actions.dart b/lib/quick_actions.dart index 77b7ab10..a7c43dbf 100644 --- a/lib/quick_actions.dart +++ b/lib/quick_actions.dart @@ -5,7 +5,6 @@ import 'package:quick_actions/quick_actions.dart'; import 'geolocation_service.dart'; import 'l10n/app_localizations.dart'; -import 'preferences.dart'; class QuickActionsInitializer extends StatefulWidget { const QuickActionsInitializer({super.key}); @@ -24,11 +23,11 @@ class _QuickActionsInitializerState extends State { FirebaseCrashlytics.instance.log('quick_action: $shortcutType'); switch (shortcutType) { case 'start': - await GeolocationService.tracker.start(Preferences.buildConfig()); + await GeolocationService.tracker.start(); case 'stop': await GeolocationService.tracker.stop(); case 'sos': - await GeolocationService.tracker.requestPosition(Preferences.buildConfig()); + await GeolocationService.tracker.requestPosition(); } if (mounted) { FirebaseCrashlytics.instance.log('quick_action_exit'); diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index ccc8480e..c9192447 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -76,7 +76,7 @@ class _SettingsScreenState extends State { } else { await Preferences.instance.setString(key, result); } - await GeolocationService.restartIfTracking(); + await GeolocationService.tracker.setConfig(Preferences.buildConfig()); setState(() {}); } } @@ -146,7 +146,7 @@ class _SettingsScreenState extends State { ); if (selectedAccuracy != null) { await Preferences.instance.setString(Preferences.accuracy, selectedAccuracy); - await GeolocationService.restartIfTracking(); + await GeolocationService.tracker.setConfig(Preferences.buildConfig()); setState(() {}); } }, @@ -193,7 +193,7 @@ class _SettingsScreenState extends State { value: Preferences.instance.getBool(Preferences.buffer) ?? true, onChanged: (value) async { await Preferences.instance.setBool(Preferences.buffer, value); - await GeolocationService.restartIfTracking(); + await GeolocationService.tracker.setConfig(Preferences.buildConfig()); setState(() {}); }, ), @@ -203,7 +203,7 @@ class _SettingsScreenState extends State { value: Preferences.instance.getBool(Preferences.wakelock) ?? false, onChanged: (value) async { await Preferences.instance.setBool(Preferences.wakelock, value); - await GeolocationService.restartIfTracking(); + await GeolocationService.tracker.setConfig(Preferences.buildConfig()); setState(() {}); }, ), @@ -213,7 +213,7 @@ class _SettingsScreenState extends State { value: Preferences.instance.getBool(Preferences.stopDetection) ?? true, onChanged: (value) async { await Preferences.instance.setBool(Preferences.stopDetection, value); - await GeolocationService.restartIfTracking(); + await GeolocationService.tracker.setConfig(Preferences.buildConfig()); setState(() {}); }, ), diff --git a/pubspec.yaml b/pubspec.yaml index 9a52492c..58d19435 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.14 + traccar_client_sdk: ^0.0.17 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From bf71922b25b93d8df42cae52296e14ded8409750 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 19 Jun 2026 18:43:25 -0700 Subject: [PATCH 158/235] Update SDK version --- lib/l10n/app_en.arb | 1 + lib/preferences.dart | 4 +++- lib/settings_screen.dart | 10 ++++++++++ pubspec.yaml | 2 +- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index fe04718a..30566432 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -25,6 +25,7 @@ "bufferLabel": "Offline buffering", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Continuous tracking", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/preferences.dart b/lib/preferences.dart index bf26bdbf..443d7726 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -18,6 +18,7 @@ class Preferences { static const String buffer = 'buffer'; static const String wakelock = 'wakelock'; static const String stopDetection = 'stop_detection'; + static const String preferPlatformProviders = 'prefer_platform_providers'; static const String password = 'password'; static Future init() async { @@ -32,7 +33,7 @@ class Preferences { : SharedPreferencesOptions(), cacheOptions: SharedPreferencesWithCacheOptions( allowList: { - id, url, accuracy, distance, interval, angle, buffer, wakelock, stopDetection, password, + id, url, accuracy, distance, interval, angle, buffer, wakelock, stopDetection, preferPlatformProviders, password, }, ), ); @@ -65,6 +66,7 @@ class Preferences { ), wakeLock: instance.getBool(wakelock) ?? false, buffer: instance.getBool(buffer) ?? true, + preferPlatformProviders: instance.getBool(preferPlatformProviders) ?? false, ); } } diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index c9192447..a2bb3d3b 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -217,6 +217,16 @@ class _SettingsScreenState extends State { setState(() {}); }, ), + if (advanced && Platform.isAndroid) + SwitchListTile( + title: Text(AppLocalizations.of(context)!.preferPlatformProvidersLabel), + value: Preferences.instance.getBool(Preferences.preferPlatformProviders) ?? false, + onChanged: (value) async { + await Preferences.instance.setBool(Preferences.preferPlatformProviders, value); + await GeolocationService.tracker.setConfig(Preferences.buildConfig()); + setState(() {}); + }, + ), if (advanced) ListTile( title: Text(AppLocalizations.of(context)!.passwordLabel), diff --git a/pubspec.yaml b/pubspec.yaml index 58d19435..b4dca294 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.17 + traccar_client_sdk: ^0.0.19 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From e70a178b1f3eafd78ba3920b8bebcc94a013f225 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 19 Jun 2026 21:40:01 -0700 Subject: [PATCH 159/235] Update SDK version --- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index ad512f39..cd1b7099 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -122,8 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/traccar/traccar-client-sdk.git", "state" : { - "revision" : "721d3790f2c50a144d342ef35197184357d389fc", - "version" : "0.0.16" + "revision" : "001ed62273bf2aeb0233cc13b2ceb563a18bf6ce", + "version" : "0.0.21" } } ], diff --git a/pubspec.yaml b/pubspec.yaml index b4dca294..56d0d63f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.19 + traccar_client_sdk: ^0.0.21 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From 1e7b94a6ba27b9f14b00ce0e1838b27cf56e681e Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 20 Jun 2026 06:58:38 -0700 Subject: [PATCH 160/235] No wait for token upload --- lib/push_service.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/push_service.dart b/lib/push_service.dart index 7af36a8d..a93b24cd 100644 --- a/lib/push_service.dart +++ b/lib/push_service.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:developer' as developer; import 'dart:io'; @@ -15,6 +16,10 @@ class PushService { FirebaseMessaging.onBackgroundMessage(pushServiceBackgroundHandler); FirebaseMessaging.onMessage.listen(_onMessage); FirebaseMessaging.instance.onTokenRefresh.listen(_uploadToken); + unawaited(_uploadInitialToken()); + } + + static Future _uploadInitialToken() async { try { await _uploadToken(await FirebaseMessaging.instance.getToken()); } catch (error) { From 526bb2e020cc3889059eacd0425d0099b6f9bf62 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 20 Jun 2026 06:59:58 -0700 Subject: [PATCH 161/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 56d0d63f..1dd7f0bf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 9.7.20+137 +version: 10.0.0+138 environment: sdk: ^3.7.2 From 033ddfc7a33f1b65e44cb30bf9649e184add0577 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 21 Jun 2026 08:07:40 -0700 Subject: [PATCH 162/235] Update SDK version --- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index cd1b7099..34787b5c 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -122,8 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/traccar/traccar-client-sdk.git", "state" : { - "revision" : "001ed62273bf2aeb0233cc13b2ceb563a18bf6ce", - "version" : "0.0.21" + "revision" : "3d10297dbd294f965c3cbc07d68fc047e3e6338a", + "version" : "0.0.23" } } ], diff --git a/pubspec.yaml b/pubspec.yaml index 1dd7f0bf..b57861e7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.21 + traccar_client_sdk: ^0.0.23 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From 33619e543b959a521e12b7c35036209e4bcd215c Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 21 Jun 2026 08:11:08 -0700 Subject: [PATCH 163/235] Support SOS shortcut --- lib/quick_actions.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/quick_actions.dart b/lib/quick_actions.dart index a7c43dbf..b4b8d7dc 100644 --- a/lib/quick_actions.dart +++ b/lib/quick_actions.dart @@ -27,7 +27,7 @@ class _QuickActionsInitializerState extends State { case 'stop': await GeolocationService.tracker.stop(); case 'sos': - await GeolocationService.tracker.requestPosition(); + await GeolocationService.tracker.requestPosition(alarm: 'sos'); } if (mounted) { FirebaseCrashlytics.instance.log('quick_action_exit'); From 1c7ab8f200ef085bfbca6bfab424362d762de3f9 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 22 Jun 2026 06:41:00 -0700 Subject: [PATCH 164/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index b57861e7..ff37d9db 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.23 + traccar_client_sdk: ^0.0.24 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From 34435ef3175d86024dc1d59516dd109d150eea45 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 23 Jun 2026 06:14:01 -0700 Subject: [PATCH 165/235] Bring back heartbeat support --- lib/preferences.dart | 4 +++- lib/settings_screen.dart | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/preferences.dart b/lib/preferences.dart index 443d7726..8519c748 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -15,6 +15,7 @@ class Preferences { static const String distance = 'distance'; static const String interval = 'interval'; static const String angle = 'angle'; + static const String heartbeat = 'heartbeat'; static const String buffer = 'buffer'; static const String wakelock = 'wakelock'; static const String stopDetection = 'stop_detection'; @@ -33,7 +34,7 @@ class Preferences { : SharedPreferencesOptions(), cacheOptions: SharedPreferencesWithCacheOptions( allowList: { - id, url, accuracy, distance, interval, angle, buffer, wakelock, stopDetection, preferPlatformProviders, password, + id, url, accuracy, distance, interval, angle, heartbeat, buffer, wakelock, stopDetection, preferPlatformProviders, password, }, ), ); @@ -62,6 +63,7 @@ class Preferences { distanceMeters: instance.getInt(distance) ?? 75, intervalSeconds: instance.getInt(interval) ?? 300, angleDegrees: instance.getInt(angle) ?? 0, + heartbeatIntervalSeconds: instance.getInt(heartbeat) ?? 0, stopDetection: instance.getBool(stopDetection) ?? true, ), wakeLock: instance.getBool(wakelock) ?? false, diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index a2bb3d3b..1ba1bae3 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -69,8 +69,11 @@ class _SettingsScreenState extends State { } } if (isInt) { - final intValue = int.tryParse(result); + int? intValue = int.tryParse(result); if (intValue != null) { + if (key == Preferences.heartbeat && intValue > 0 && intValue < 60) { + intValue = 60; // minimum heartbeat is 60 seconds + } await Preferences.instance.setInt(key, intValue); } } else { @@ -180,6 +183,7 @@ class _SettingsScreenState extends State { _buildListTile(AppLocalizations.of(context)!.intervalLabel, Preferences.interval, true), if (isHighestAccuracy) _buildListTile(AppLocalizations.of(context)!.angleLabel, Preferences.angle, true), + _buildListTile(AppLocalizations.of(context)!.heartbeatLabel, Preferences.heartbeat, true), SwitchListTile( title: Text(AppLocalizations.of(context)!.advancedLabel), value: advanced, From c9ecdc32c1dc6c94de203df2ece78d684f6c34e7 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 23 Jun 2026 06:14:32 -0700 Subject: [PATCH 166/235] Update build code --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index ff37d9db..aa7f5f9c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.0+138 +version: 10.0.0+139 environment: sdk: ^3.7.2 From 244f9f3154d6dc652192e6a95084b63d63ab0544 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 23 Jun 2026 06:35:08 -0700 Subject: [PATCH 167/235] Update release workflow --- .github/workflows/release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04fb2b50..d5faba0d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -152,11 +152,12 @@ jobs: APP_STORE_CONNECT_KEY_IDENTIFIER: ${{ secrets.ASC_KEY_ID }} APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} run: | - app-store-connect fetch-signing-files "$IOS_BUNDLE_ID" \ + app-store-connect --verbose fetch-signing-files "$IOS_BUNDLE_ID" \ --type IOS_APP_STORE \ --private-key "@file:$RUNNER_TEMP/AuthKey.p8" \ --certificate-key "@file:$RUNNER_TEMP/dist_private_key.pem" \ - --create + --create \ + --api-server-error-retries 1 - name: Install certificates into keychain run: keychain add-certificates From 925374c95cacf045f09244a78cdb5d203ea14080 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 23 Jun 2026 06:41:37 -0700 Subject: [PATCH 168/235] Revert "Update release workflow" This reverts commit 244f9f3154d6dc652192e6a95084b63d63ab0544. --- .github/workflows/release.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d5faba0d..04fb2b50 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -152,12 +152,11 @@ jobs: APP_STORE_CONNECT_KEY_IDENTIFIER: ${{ secrets.ASC_KEY_ID }} APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} run: | - app-store-connect --verbose fetch-signing-files "$IOS_BUNDLE_ID" \ + app-store-connect fetch-signing-files "$IOS_BUNDLE_ID" \ --type IOS_APP_STORE \ --private-key "@file:$RUNNER_TEMP/AuthKey.p8" \ --certificate-key "@file:$RUNNER_TEMP/dist_private_key.pem" \ - --create \ - --api-server-error-retries 1 + --create - name: Install certificates into keychain run: keychain add-certificates From 0dd66cd8ca4b858cc8cf5eda65194342b6b64419 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 24 Jun 2026 09:01:05 -0700 Subject: [PATCH 169/235] Update SDK and build code --- pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index aa7f5f9c..feb0c0f9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.0+139 +version: 10.0.0+140 environment: sdk: ^3.7.2 @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.24 + traccar_client_sdk: ^0.0.25 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From 8d1dbb77094bdc36278ec992d0e50fdc5a42ca6f Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 24 Jun 2026 10:15:52 -0700 Subject: [PATCH 170/235] Fix configuration deeplink --- lib/configuration_service.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/configuration_service.dart b/lib/configuration_service.dart index 8874a876..b48c8793 100644 --- a/lib/configuration_service.dart +++ b/lib/configuration_service.dart @@ -17,9 +17,11 @@ class ConfigurationService { await _applyIntParameter(parameters, Preferences.distance); await _applyIntParameter(parameters, Preferences.interval); await _applyIntParameter(parameters, Preferences.angle); + await _applyIntParameter(parameters, Preferences.heartbeat); await _applyBoolParameter(parameters, Preferences.buffer); await _applyBoolParameter(parameters, Preferences.wakelock); await _applyBoolParameter(parameters, Preferences.stopDetection); + await _applyBoolParameter(parameters, Preferences.preferPlatformProviders); await GeolocationService.tracker.setConfig(Preferences.buildConfig()); } From 1cd103b516b3730ddfc7f5f797181b575f4d257e Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 25 Jun 2026 06:11:31 -0700 Subject: [PATCH 171/235] Fix double link handing --- lib/main.dart | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 05f65fc9..35b9d511 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -57,12 +57,7 @@ class _MainAppState extends State { } Future _initLinks() async { - final appLinks = AppLinks(); - final uri = await appLinks.getInitialLink(); - if (uri != null) { - await _handleUri(uri); - } - appLinks.uriLinkStream.listen(_handleUri); + AppLinks().uriLinkStream.listen(_handleUri); } Future _handleUri(Uri uri) async { From 50cab698289abd047f320a90f918374648e2d26c Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 5 Jul 2026 12:58:33 -0700 Subject: [PATCH 172/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index feb0c0f9..9371ab91 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.0+140 +version: 10.0.0+141 environment: sdk: ^3.7.2 From 3f721cdb319e9ffaeb04445170d97a7a75a6e502 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 7 Jul 2026 05:10:34 -0700 Subject: [PATCH 173/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 9371ab91..2a5c4bbc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.25 + traccar_client_sdk: ^0.0.26 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From 8c8f84911d78cf76068b7f2e693b83b49ca51372 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 7 Jul 2026 05:10:51 -0700 Subject: [PATCH 174/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2a5c4bbc..98495569 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.0+141 +version: 10.0.1+142 environment: sdk: ^3.7.2 From a8d42299a80d65724a8da3dbd0a94fad9aa52f5a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 7 Jul 2026 05:49:38 -0700 Subject: [PATCH 175/235] Fix mapping upload --- .github/workflows/release.yml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04fb2b50..7ea8b232 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,8 +54,10 @@ jobs: - uses: actions/upload-artifact@v5 with: - name: android-apk - path: build/app/outputs/flutter-apk/app-release.apk + name: android-release + path: | + build/app/outputs/flutter-apk/app-release.apk + build/app/outputs/mapping/release/mapping.txt if-no-files-found: error retention-days: 1 @@ -71,7 +73,7 @@ jobs: - uses: actions/download-artifact@v5 with: - name: android-apk + name: android-release path: . - name: Launch emulator and verify app starts @@ -84,7 +86,7 @@ jobs: disable-animations: true script: | adb wait-for-device - adb install -r app-release.apk + adb install -r flutter-apk/app-release.apk adb shell am start -W -n org.traccar.client/org.traccar.client.MainActivity sleep 10 adb shell screencap -p /sdcard/launch.png @@ -103,15 +105,16 @@ jobs: steps: - uses: actions/download-artifact@v5 with: - name: android-apk - path: apk + name: android-release + path: . - name: Upload to Google Play (production) uses: r0adkll/upload-google-play@v1 with: serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }} packageName: org.traccar.client - releaseFiles: apk/app-release.apk + releaseFiles: flutter-apk/app-release.apk + mappingFile: mapping/release/mapping.txt track: production status: completed @@ -222,10 +225,10 @@ jobs: steps: - uses: actions/download-artifact@v5 with: - name: android-apk - path: apk + name: android-release + path: . - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: - files: apk/app-release.apk + files: flutter-apk/app-release.apk From 51a2b1d26753b724298973738a985336b4853709 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 7 Jul 2026 05:57:10 -0700 Subject: [PATCH 176/235] Fix dart error capture --- lib/main.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index 35b9d511..bf5d6118 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:developer' as developer; +import 'dart:ui' show PlatformDispatcher; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; @@ -23,6 +24,10 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; + PlatformDispatcher.instance.onError = (error, stack) { + FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); + return true; + }; await Preferences.init(); await GeolocationService.tracker.init(Preferences.buildConfig()); await PasswordService.migrate(); From f6a724d2b9e8e3d57ba91bb8a8965e1f50e03b58 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 7 Jul 2026 06:03:37 -0700 Subject: [PATCH 177/235] Upload iOS symbols --- firebase.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase.json b/firebase.json index b024418a..075dbd63 100644 --- a/firebase.json +++ b/firebase.json @@ -1 +1 @@ -{"flutter":{"platforms":{"android":{"default":{"projectId":"traccar-client-app","appId":"1:39016471396:android:b1c7194c699bfa25","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"traccar-client-app","appId":"1:39016471396:ios:78cbbf5775b43308","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"traccar-client-app","configurations":{"android":"1:39016471396:android:b1c7194c699bfa25","ios":"1:39016471396:ios:78cbbf5775b43308"}}}}}} \ No newline at end of file +{"flutter":{"platforms":{"android":{"default":{"projectId":"traccar-client-app","appId":"1:39016471396:android:b1c7194c699bfa25","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"traccar-client-app","appId":"1:39016471396:ios:78cbbf5775b43308","uploadDebugSymbols":true,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"traccar-client-app","configurations":{"android":"1:39016471396:android:b1c7194c699bfa25","ios":"1:39016471396:ios:78cbbf5775b43308"}}}}}} \ No newline at end of file From c63503ec2c5c38ffb4bb07f28f0eeb4b17530779 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 7 Jul 2026 06:26:52 -0700 Subject: [PATCH 178/235] Revert iOS flag --- firebase.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase.json b/firebase.json index 075dbd63..b024418a 100644 --- a/firebase.json +++ b/firebase.json @@ -1 +1 @@ -{"flutter":{"platforms":{"android":{"default":{"projectId":"traccar-client-app","appId":"1:39016471396:android:b1c7194c699bfa25","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"traccar-client-app","appId":"1:39016471396:ios:78cbbf5775b43308","uploadDebugSymbols":true,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"traccar-client-app","configurations":{"android":"1:39016471396:android:b1c7194c699bfa25","ios":"1:39016471396:ios:78cbbf5775b43308"}}}}}} \ No newline at end of file +{"flutter":{"platforms":{"android":{"default":{"projectId":"traccar-client-app","appId":"1:39016471396:android:b1c7194c699bfa25","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"traccar-client-app","appId":"1:39016471396:ios:78cbbf5775b43308","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"traccar-client-app","configurations":{"android":"1:39016471396:android:b1c7194c699bfa25","ios":"1:39016471396:ios:78cbbf5775b43308"}}}}}} \ No newline at end of file From 0177c8477b6b441702eb9eddbbd71617334b7fc7 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 7 Jul 2026 06:27:12 -0700 Subject: [PATCH 179/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 98495569..fd8f051f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^0.0.26 + traccar_client_sdk: ^1.0.0 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From 3332dbd74fb113f5dbf7711c9fffe648b18aa2d1 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 7 Jul 2026 06:27:28 -0700 Subject: [PATCH 180/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index fd8f051f..47136263 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.1+142 +version: 10.0.2+143 environment: sdk: ^3.7.2 From dcd1c9e56e00c5341c9ceed67e875dd30f63d24e Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 06:30:57 -0700 Subject: [PATCH 181/235] Add dsyms upload --- .github/workflows/release.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7ea8b232..5e0aa4df 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -187,6 +187,13 @@ jobs: -exportPath "$EXPORT_PATH" \ -exportOptionsPlist "$RUNNER_TEMP/ExportOptions.plist" + - name: Upload dSYMs to Crashlytics + run: | + ios/Pods/FirebaseCrashlytics/upload-symbols \ + -gsp ios/Runner/GoogleService-Info.plist \ + -p ios \ + "$RUNNER_TEMP/Runner.xcarchive/dSYMs" + - uses: actions/upload-artifact@v5 with: name: ios-ipa From 8a27c5b8f85fcf18729569743679a8785d188985 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 06:38:08 -0700 Subject: [PATCH 182/235] Fix rate dialog crash --- lib/main.dart | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index bf5d6118..0b9bb8ae 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -51,12 +51,9 @@ class _MainAppState extends State { WidgetsBinding.instance.addPostFrameCallback((_) async { await _initLinks(); await rateMyApp.init(); - if (mounted && rateMyApp.shouldOpenDialog) { - try { - await rateMyApp.showRateDialog(context); - } catch (error) { - developer.log('Failed to show rate dialog', error: error); - } + final dialogContext = navigatorKey.currentContext; + if (dialogContext != null && dialogContext.mounted && rateMyApp.shouldOpenDialog) { + await rateMyApp.showRateDialog(dialogContext); } }); } From b3b2de34398843b086bac10bf0c53c7faf2aa329 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 06:38:30 -0700 Subject: [PATCH 183/235] Remove unused import --- lib/main.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 0b9bb8ae..ac68944c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:developer' as developer; import 'dart:ui' show PlatformDispatcher; import 'package:firebase_core/firebase_core.dart'; From 1703947e6666cd7fcb05553f9dd7116598b1974a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 07:23:57 -0700 Subject: [PATCH 184/235] Disable default deep links --- android/app/src/main/AndroidManifest.xml | 4 ++++ ios/Runner/Info.plist | 2 ++ 2 files changed, 6 insertions(+) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ee4dce04..d4ca02f0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -24,6 +24,10 @@ android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 9684e0f9..4eab0e67 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -37,6 +37,8 @@ CFBundleVersion $(FLUTTER_BUILD_NUMBER) + FlutterDeepLinkingEnabled + LSRequiresIPhoneOS NSAppTransportSecurity From 6a953b6b73db9a14b37c2d184d8f4c90c0c0f5c2 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 07:27:55 -0700 Subject: [PATCH 185/235] Handle legacy configuration --- lib/preferences.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/preferences.dart b/lib/preferences.dart index 8519c748..324692e8 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -38,6 +38,13 @@ class Preferences { }, ), ); + if (Platform.isAndroid) { + for (final key in {interval, distance, angle, heartbeat}) { + if (instance.get(key) is String) { + await instance.setInt(key, int.tryParse(instance.getString(key) ?? '') ?? 0); + } + } + } if (instance.getString(id) == null) { await instance.setString(id, (Random().nextInt(90000000) + 10000000).toString()); await instance.setString(url, 'http://demo.traccar.org:5055'); From 931259e2bdd889882a854701b53f54c540e102b3 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 07:37:06 -0700 Subject: [PATCH 186/235] Handle missing permissions --- lib/main.dart | 15 ++++++++++----- lib/push_service.dart | 23 ++++++++++++++--------- lib/quick_actions.dart | 18 +++++++++++------- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index ac68944c..5e21b0e5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'dart:ui' show PlatformDispatcher; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:app_links/app_links.dart'; import 'package:rate_my_app/rate_my_app.dart'; import 'package:traccar_client/password_service.dart'; @@ -63,11 +64,15 @@ class _MainAppState extends State { Future _handleUri(Uri uri) async { if (uri.host == 'action') { - switch (uri.pathSegments.firstOrNull) { - case 'start': - await GeolocationService.tracker.start(); - case 'stop': - await GeolocationService.tracker.stop(); + try { + switch (uri.pathSegments.firstOrNull) { + case 'start': + await GeolocationService.tracker.start(); + case 'stop': + await GeolocationService.tracker.stop(); + } + } on PlatformException { + // permission denied or startup error } return; } diff --git a/lib/push_service.dart b/lib/push_service.dart index a93b24cd..5f52cead 100644 --- a/lib/push_service.dart +++ b/lib/push_service.dart @@ -5,6 +5,7 @@ import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/services.dart'; import 'package:traccar_client/password_service.dart'; import 'geolocation_service.dart'; @@ -30,15 +31,19 @@ class PushService { static Future _onMessage(RemoteMessage message) async { final command = message.data['command']; FirebaseCrashlytics.instance.log('push_command: $command'); - switch (command) { - case 'positionSingle': - await GeolocationService.tracker.requestPosition(); - case 'positionPeriodic': - await GeolocationService.tracker.start(); - case 'positionStop': - await GeolocationService.tracker.stop(); - case 'factoryReset': - await PasswordService.setPassword(''); + try { + switch (command) { + case 'positionSingle': + await GeolocationService.tracker.requestPosition(); + case 'positionPeriodic': + await GeolocationService.tracker.start(); + case 'positionStop': + await GeolocationService.tracker.stop(); + case 'factoryReset': + await PasswordService.setPassword(''); + } + } on PlatformException { + // permission denied or startup error } } diff --git a/lib/quick_actions.dart b/lib/quick_actions.dart index b4b8d7dc..a3a9f79c 100644 --- a/lib/quick_actions.dart +++ b/lib/quick_actions.dart @@ -21,13 +21,17 @@ class _QuickActionsInitializerState extends State { super.initState(); quickActions.initialize((shortcutType) async { FirebaseCrashlytics.instance.log('quick_action: $shortcutType'); - switch (shortcutType) { - case 'start': - await GeolocationService.tracker.start(); - case 'stop': - await GeolocationService.tracker.stop(); - case 'sos': - await GeolocationService.tracker.requestPosition(alarm: 'sos'); + try { + switch (shortcutType) { + case 'start': + await GeolocationService.tracker.start(); + case 'stop': + await GeolocationService.tracker.stop(); + case 'sos': + await GeolocationService.tracker.requestPosition(alarm: 'sos'); + } + } on PlatformException { + // permission denied or startup error } if (mounted) { FirebaseCrashlytics.instance.log('quick_action_exit'); From 2c8a8e90485b596b770ff6caef4f03496bdcd8c7 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 07:39:53 -0700 Subject: [PATCH 187/235] Handle missing permissions --- lib/main_screen.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/main_screen.dart b/lib/main_screen.dart index 5834adfa..f624eb8f 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -113,7 +113,11 @@ class _MainScreenState extends State with WidgetsBindingObserver { children: [ FilledButton.tonal( onPressed: () async { - await GeolocationService.tracker.requestPosition(); + try { + await GeolocationService.tracker.requestPosition(); + } on PlatformException { + // permission denied or location error + } }, child: Text(AppLocalizations.of(context)!.locationButton), ), From c0177f5f5cc174845feb5b20f329c0144136a285 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 08:15:40 -0700 Subject: [PATCH 188/235] Handle empty logs --- lib/status_screen.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/status_screen.dart b/lib/status_screen.dart index 445d5e7d..8b29c3fc 100644 --- a/lib/status_screen.dart +++ b/lib/status_screen.dart @@ -47,6 +47,7 @@ class _StatusScreenState extends State { } Future _shareLogs() async { + if (_logs.isEmpty) return; final text = _logs.reversed.map((entry) { final t = DateTime.fromMillisecondsSinceEpoch(entry.time); return '${_fullFormat.format(t)} ${entry.message}'; From cfc05659c98a1930046d4e76323582a17dacd553 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 08:17:18 -0700 Subject: [PATCH 189/235] Safer logs screen --- lib/status_screen.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/status_screen.dart b/lib/status_screen.dart index 8b29c3fc..242d81ef 100644 --- a/lib/status_screen.dart +++ b/lib/status_screen.dart @@ -41,6 +41,7 @@ class _StatusScreenState extends State { Future _refreshLogs() async { final logs = await GeolocationService.tracker.getLogs(); + if (!mounted) return; setState(() { _logs = logs.reversed.toList(growable: false); }); @@ -57,6 +58,7 @@ class _StatusScreenState extends State { Future _clearLogs() async { await GeolocationService.tracker.clearLogs(); + if (!mounted) return; setState(() => _logs = const []); } From 24fc013976995c2c883793a10c75cc161562a636 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 10:09:02 -0700 Subject: [PATCH 190/235] Fix release workflow --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5e0aa4df..fa556abc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -189,7 +189,8 @@ jobs: - name: Upload dSYMs to Crashlytics run: | - ios/Pods/FirebaseCrashlytics/upload-symbols \ + UPLOAD_SYMBOLS=$(find build/ios/SourcePackages/checkouts -name upload-symbols -type f | head -1) + "$UPLOAD_SYMBOLS" \ -gsp ios/Runner/GoogleService-Info.plist \ -p ios \ "$RUNNER_TEMP/Runner.xcarchive/dSYMs" From 92b55db3861a1750e7c77218d6212f446963ca40 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 17:51:54 -0700 Subject: [PATCH 191/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 47136263..d21b587e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^1.0.0 + traccar_client_sdk: ^1.0.2 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From 46ba2811ee8253cbfb2fb5e65d7d58dd994f55d6 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 8 Jul 2026 17:52:07 -0700 Subject: [PATCH 192/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index d21b587e..9be6be85 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.2+143 +version: 10.0.3+144 environment: sdk: ^3.7.2 From d6ab05f36816436bc3c4d68a99ca8b18d9507bfa Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 9 Jul 2026 07:23:25 -0700 Subject: [PATCH 193/235] Always show distance --- lib/settings_screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index 1ba1bae3..107589a6 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -116,7 +116,7 @@ class _SettingsScreenState extends State { String? value; if (isInt) { final intValue = Preferences.instance.getInt(key); - if (intValue != null && intValue > 0) { + if (intValue != null && (intValue > 0 || key == Preferences.distance)) { value = intValue.toString(); } else { value = AppLocalizations.of(context)!.disabledValue; From 2d363cdde6909f21e93e333a137297d8b179abf2 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 9 Jul 2026 22:03:39 -0700 Subject: [PATCH 194/235] Fix locked actions (fix #199) --- .../xcshareddata/swiftpm/Package.resolved | 4 ++-- ios/Runner/AppIntents.swift | 14 +++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 34787b5c..af3885eb 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -122,8 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/traccar/traccar-client-sdk.git", "state" : { - "revision" : "3d10297dbd294f965c3cbc07d68fc047e3e6338a", - "version" : "0.0.23" + "revision" : "319a4cf79915925ba3ccf215fcf1545a7a8d2021", + "version" : "1.0.2" } } ], diff --git a/ios/Runner/AppIntents.swift b/ios/Runner/AppIntents.swift index 76e25af8..defef3a4 100644 --- a/ios/Runner/AppIntents.swift +++ b/ios/Runner/AppIntents.swift @@ -1,20 +1,13 @@ import AppIntents -import UIKit - -@available(iOS 16.0, *) -@MainActor -private func openAction(_ name: String) async { - await UIApplication.shared.open(URL(string: "org.traccar.client://action/\(name)")!) -} +import TraccarClientSDK @available(iOS 16.0, *) struct StartTrackingIntent: AppIntent { static var title: LocalizedStringResource = "Start Tracking" static var description = IntentDescription("Start continuous location tracking") - static var openAppWhenRun: Bool = true func perform() async throws -> some IntentResult { - await openAction("start") + try await TrackerKt.sharedTracker()?.start() return .result() } } @@ -23,10 +16,9 @@ struct StartTrackingIntent: AppIntent { struct StopTrackingIntent: AppIntent { static var title: LocalizedStringResource = "Stop Tracking" static var description = IntentDescription("Stop continuous location tracking") - static var openAppWhenRun: Bool = true func perform() async throws -> some IntentResult { - await openAction("stop") + try await TrackerKt.sharedTracker()?.stop() return .result() } } From a913cf2fe234d45f0ec836bcac45e98ab5959ff9 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 9 Jul 2026 22:58:51 -0700 Subject: [PATCH 195/235] Rename notification icon --- .../drawable/{ic_stat_notify.xml => ic_tracker_notification.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename android/app/src/main/res/drawable/{ic_stat_notify.xml => ic_tracker_notification.xml} (100%) diff --git a/android/app/src/main/res/drawable/ic_stat_notify.xml b/android/app/src/main/res/drawable/ic_tracker_notification.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_stat_notify.xml rename to android/app/src/main/res/drawable/ic_tracker_notification.xml From 05b9f33ccccc4e927d740cc55ccb6e4b1aebffe2 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 9 Jul 2026 22:59:42 -0700 Subject: [PATCH 196/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 9be6be85..91fb8375 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^1.0.2 + traccar_client_sdk: ^1.0.4 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From bcffce0aff896e86f2f23662b96686cf4ce988ca Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 9 Jul 2026 23:00:00 -0700 Subject: [PATCH 197/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 91fb8375..14105424 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.3+144 +version: 10.0.4+145 environment: sdk: ^3.7.2 From 909094e57e797cde202b4708a1f793b936a9fc0b Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 11 Jul 2026 07:36:03 -0700 Subject: [PATCH 198/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 14105424..c90c79c8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^1.0.4 + traccar_client_sdk: ^1.0.5 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From 1ef04daaa72e8fdda5ec967e26e5694a46e0d494 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 11 Jul 2026 07:36:14 -0700 Subject: [PATCH 199/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c90c79c8..c14c9f61 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.4+145 +version: 10.0.5+146 environment: sdk: ^3.7.2 From f661a8375ae12d44e25742f3bbd0210001dbb0c9 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 13 Jul 2026 21:08:11 -0700 Subject: [PATCH 200/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c14c9f61..2cd57d95 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^1.0.5 + traccar_client_sdk: ^1.0.7 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ^16.2.2 From fcab16f28403f743eff8712f078ba9dfeebe7467 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 13 Jul 2026 21:08:22 -0700 Subject: [PATCH 201/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2cd57d95..c2e1e005 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.5+146 +version: 10.0.6+147 environment: sdk: ^3.7.2 From 1d6335a220202a54e29a81bc3b89135f7e8b145f Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 13 Jul 2026 21:24:54 -0700 Subject: [PATCH 202/235] Fix firebase dependency --- pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index c2e1e005..aab92747 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,9 +15,9 @@ dependencies: traccar_client_sdk: ^1.0.7 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 - firebase_messaging: ^16.2.2 + firebase_messaging: ">=16.2.2 <16.4.2" firebase_analytics: ^12.4.1 - firebase_crashlytics: ^5.2.2 + firebase_crashlytics: ">=5.2.2 <5.2.5" quick_actions: ^1.1.0 rate_my_app: ^2.4.0 shared_preferences_android: ^2.4.23 From 66afcbec64b0b76de81ec4db331232ab4e3fc9bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 23:43:06 -0400 Subject: [PATCH 203/235] Bump app_settings from 7.0.0 to 8.0.0 (#203) Bumps [app_settings](https://github.com/spencerccf/app_settings) from 7.0.0 to 8.0.0. - [Release notes](https://github.com/spencerccf/app_settings/releases) - [Changelog](https://github.com/spencerccf/app_settings/blob/master/CHANGELOG.md) - [Commits](https://github.com/spencerccf/app_settings/commits) --- updated-dependencies: - dependency-name: app_settings dependency-version: 8.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index aab92747..e54df5c9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: mobile_scanner: ^7.2.0 flutter_secure_storage: ^10.2.0 app_links: ^7.0.0 - app_settings: ^7.0.0 + app_settings: ^8.0.0 share_plus: ^13.1.0 dev_dependencies: From ea091d53ecfa76d8eede8b27ca71563bfa2bf471 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 19 Jul 2026 07:53:36 -0700 Subject: [PATCH 204/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index e54df5c9..3beb65fe 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^1.0.7 + traccar_client_sdk: ^1.0.8 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ">=16.2.2 <16.4.2" From 1a217e1585cfa7856e82e8c1f4b0ec4e21867104 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 19 Jul 2026 07:54:06 -0700 Subject: [PATCH 205/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 3beb65fe..81180c61 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.6+147 +version: 10.0.7+148 environment: sdk: ^3.7.2 From 23a77ae1938d16d47233e34fc6dbe066ac8f110e Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 25 Jul 2026 11:49:21 -0700 Subject: [PATCH 206/235] Update project file --- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index af3885eb..f6776cd4 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -122,8 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/traccar/traccar-client-sdk.git", "state" : { - "revision" : "319a4cf79915925ba3ccf215fcf1545a7a8d2021", - "version" : "1.0.2" + "revision" : "22af2133fc76f9f40b17b2f3ab878237dcc02e46", + "version" : "1.0.8" } } ], From 8cd9c44c6f621f6a380ac7ce033b3a524589a4c3 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 8 Aug 2026 04:51:28 -0700 Subject: [PATCH 207/235] Remove cocoapods --- ios/Flutter/Debug.xcconfig | 1 - ios/Flutter/Release.xcconfig | 1 - ios/Podfile | 42 ---------- ios/Runner.xcodeproj/project.pbxproj | 77 ------------------- .../contents.xcworkspacedata | 3 - 5 files changed, 124 deletions(-) delete mode 100644 ios/Podfile diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index ec97fc6f..592ceee8 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index c4855bfe..592ceee8 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile deleted file mode 100644 index cf07ade0..00000000 --- a/ios/Podfile +++ /dev/null @@ -1,42 +0,0 @@ -platform :ios, '15.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - end -end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 77d8a702..626ccfba 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -17,8 +17,6 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - F301A0628B4B67129B4EF6BC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF9CEA917E371A914E728FD9 /* Pods_Runner.framework */; }; - F7404BADF18F0407F900F367 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C29E374AB4C3F885DE083543 /* Pods_RunnerTests.framework */; }; F7C3033B72F10E5D400E8620 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 42DA49C4C866005273D03AF6 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ @@ -52,7 +50,6 @@ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 42DA49C4C866005273D03AF6 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; - 50797FECAA48F3999E66543E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; @@ -60,7 +57,6 @@ 86ABD4FC2DCDB6B60041010B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 86C43E8F2E65265A0098728F /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 86EF7BA32F7CA35C00D432C4 /* AppIntents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIntents.swift; sourceTree = ""; }; - 916E587BCD954F3AF975F0DD /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -68,12 +64,6 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A33AA4F6119A14789C2C6E69 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - AF9CEA917E371A914E728FD9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C29E374AB4C3F885DE083543 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE0A715EF6730096505424A8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - E415B078EA7A568CFE3BD2C4 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - F94AB39885A06CAB2E76EB9B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -81,7 +71,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F7404BADF18F0407F900F367 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -90,7 +79,6 @@ buildActionMask = 2147483647; files = ( 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, - F301A0628B4B67129B4EF6BC /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -126,7 +114,6 @@ 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, DC5B6CE5A1B7DC8E9FC89129 /* Pods */, - F91A8C14E37051DCD5210011 /* Frameworks */, 42DA49C4C866005273D03AF6 /* GoogleService-Info.plist */, ); sourceTree = ""; @@ -160,25 +147,10 @@ DC5B6CE5A1B7DC8E9FC89129 /* Pods */ = { isa = PBXGroup; children = ( - F94AB39885A06CAB2E76EB9B /* Pods-Runner.debug.xcconfig */, - 50797FECAA48F3999E66543E /* Pods-Runner.release.xcconfig */, - CE0A715EF6730096505424A8 /* Pods-Runner.profile.xcconfig */, - 916E587BCD954F3AF975F0DD /* Pods-RunnerTests.debug.xcconfig */, - E415B078EA7A568CFE3BD2C4 /* Pods-RunnerTests.release.xcconfig */, - A33AA4F6119A14789C2C6E69 /* Pods-RunnerTests.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F91A8C14E37051DCD5210011 /* Frameworks */ = { - isa = PBXGroup; - children = ( - AF9CEA917E371A914E728FD9 /* Pods_Runner.framework */, - C29E374AB4C3F885DE083543 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -186,7 +158,6 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 084437B0A4B5C681A48D2B96 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, 2EA3A3AB44DF851A563609FA /* Frameworks */, @@ -205,7 +176,6 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - AAF19D00E31B31B06E129F93 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -292,28 +262,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 084437B0A4B5C681A48D2B96 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -363,28 +311,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - AAF19D00E31B31B06E129F93 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -517,7 +443,6 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 916E587BCD954F3AF975F0DD /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -535,7 +460,6 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E415B078EA7A568CFE3BD2C4 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -551,7 +475,6 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A33AA4F6119A14789C2C6E69 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 21a3cc14..1d526a16 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,7 +4,4 @@ - - From 3664f1360a12c9af2be20e8f32821c768473190f Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 8 Aug 2026 04:54:18 -0700 Subject: [PATCH 208/235] Update dependencies --- pubspec.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 81180c61..d9c609ab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,13 +19,13 @@ dependencies: firebase_analytics: ^12.4.1 firebase_crashlytics: ">=5.2.2 <5.2.5" quick_actions: ^1.1.0 - rate_my_app: ^2.4.0 + rate_my_app: ^2.4.1 shared_preferences_android: ^2.4.23 - mobile_scanner: ^7.2.0 + mobile_scanner: ^7.4.0 flutter_secure_storage: ^10.2.0 app_links: ^7.0.0 - app_settings: ^8.0.0 - share_plus: ^13.1.0 + app_settings: ^8.0.3 + share_plus: ^13.3.0 dev_dependencies: flutter_test: From 24d9007f3efcf198a671db367c6c9c88da497e49 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 8 Aug 2026 04:54:43 -0700 Subject: [PATCH 209/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index d9c609ab..4ee85073 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.7+148 +version: 10.0.8+149 environment: sdk: ^3.7.2 From 355e097a9f7d7b5e7fa5a8f847fe343a07b63619 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 9 Aug 2026 17:45:59 -0700 Subject: [PATCH 210/235] Bump flutter_secure_storage from 10.3.1 to 11.0.0 (#206) Bumps [flutter_secure_storage](https://github.com/mogol/flutter_secure_storage) from 10.3.1 to 11.0.0. - [Release notes](https://github.com/mogol/flutter_secure_storage/releases) - [Commits](https://github.com/mogol/flutter_secure_storage/compare/v10.3.1...flutter_secure_storage-v11.0.0) --- updated-dependencies: - dependency-name: flutter_secure_storage dependency-version: 11.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 4ee85073..3b273cba 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: rate_my_app: ^2.4.1 shared_preferences_android: ^2.4.23 mobile_scanner: ^7.4.0 - flutter_secure_storage: ^10.2.0 + flutter_secure_storage: ^11.0.0 app_links: ^7.0.0 app_settings: ^8.0.3 share_plus: ^13.3.0 From a0727e381145dd278d574c39e4f2d3578d461187 Mon Sep 17 00:00:00 2001 From: Traccar Bot Date: Mon, 10 Aug 2026 04:39:13 +0000 Subject: [PATCH 211/235] Update translations --- lib/l10n/app_ar.arb | 1 + lib/l10n/app_ca.arb | 1 + lib/l10n/app_cs.arb | 1 + lib/l10n/app_de.arb | 1 + lib/l10n/app_es.arb | 3 ++- lib/l10n/app_fa.arb | 1 + lib/l10n/app_fi.arb | 1 + lib/l10n/app_fr.arb | 1 + lib/l10n/app_he.arb | 1 + lib/l10n/app_id.arb | 1 + lib/l10n/app_it.arb | 5 +++-- lib/l10n/app_ja.arb | 1 + lib/l10n/app_ko.arb | 1 + lib/l10n/app_lt.arb | 1 + lib/l10n/app_lv.arb | 1 + lib/l10n/app_nl.arb | 1 + lib/l10n/app_pl.arb | 1 + lib/l10n/app_pt.arb | 1 + lib/l10n/app_pt_BR.arb | 1 + lib/l10n/app_ru.arb | 1 + lib/l10n/app_sl.arb | 1 + lib/l10n/app_th.arb | 1 + lib/l10n/app_tr.arb | 1 + lib/l10n/app_uk.arb | 1 + lib/l10n/app_zh.arb | 3 ++- lib/l10n/app_zh_TW.arb | 3 ++- 26 files changed, 31 insertions(+), 5 deletions(-) diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 62b2b400..7cfdc0c5 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -25,6 +25,7 @@ "bufferLabel": "تخزين مؤقت دون اتصال", "wakelockLabel": "قفل التنبيه", "stopDetectionLabel": "اكتشاف التوقف", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "تتبع مستمر", "advancedLabel": "إعدادات متقدمة", "passwordLabel": "كلمة المرور", diff --git a/lib/l10n/app_ca.arb b/lib/l10n/app_ca.arb index 286f441f..4728f4ce 100644 --- a/lib/l10n/app_ca.arb +++ b/lib/l10n/app_ca.arb @@ -25,6 +25,7 @@ "bufferLabel": "Memòria intermèdia fora de línia", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Seguiment continu", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index 7ca39f50..b55101ba 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -25,6 +25,7 @@ "bufferLabel": "Ukládání do vyrovnávací paměti", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Nepřetržité sledování", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index ebebc5fe..cbfc65f1 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -25,6 +25,7 @@ "bufferLabel": "Offline-Pufferung", "wakelockLabel": "Wakelock", "stopDetectionLabel": "Stopp-Erkennung", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Kontinuierliches Tracking", "advancedLabel": "Erweiterte Einstellungen", "passwordLabel": "Password", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 71465e2b..183e6a2c 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -25,6 +25,7 @@ "bufferLabel": "Búfer sin conexión", "wakelockLabel": "Bloqueo de suspensión", "stopDetectionLabel": "Detección de parada", + "preferPlatformProvidersLabel": "Usar la ubicación del sistema", "trackingLabel": "Seguimiento continuo", "advancedLabel": "Ajustes avanzados", "passwordLabel": "Contraseña", @@ -34,5 +35,5 @@ "stopAction": "Detener servicio", "sosAction": "Enviar SOS", "disclosureMessage": "Esta aplicación recopila datos de ubicación y actividad en segundo plano y los envía al servidor configurado.", - "configurationMessage": "Apply new configuration?" + "configurationMessage": "Aplicar la nueva configuración?" } diff --git a/lib/l10n/app_fa.arb b/lib/l10n/app_fa.arb index c31647d5..cca328a0 100644 --- a/lib/l10n/app_fa.arb +++ b/lib/l10n/app_fa.arb @@ -25,6 +25,7 @@ "bufferLabel": "حافظه آفلاین", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "مسیر ادامه دار", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index acce471d..d7f55884 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -25,6 +25,7 @@ "bufferLabel": "Offline puskuri", "wakelockLabel": "Pakota päälläolo", "stopDetectionLabel": "Pysähdyksissä olon tunnistus", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Jatkuva paikannus", "advancedLabel": "Lisäasetukset", "passwordLabel": "Salasana", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 888467a7..77dbd717 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -25,6 +25,7 @@ "bufferLabel": "Mise en tampon hors ligne", "wakelockLabel": "Maintien éveillé", "stopDetectionLabel": "Détection d'arrêt", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Suivi continu", "advancedLabel": "Paramètres avancés", "passwordLabel": "Password", diff --git a/lib/l10n/app_he.arb b/lib/l10n/app_he.arb index 1413bbf6..b0d64263 100644 --- a/lib/l10n/app_he.arb +++ b/lib/l10n/app_he.arb @@ -25,6 +25,7 @@ "bufferLabel": "אחסון לא מקוון", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "מעקב רציף", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 065816d0..e06f06e5 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -25,6 +25,7 @@ "bufferLabel": "Buffering offline", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Deteksi berhenti", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Pelacakan berkelanjutan", "advancedLabel": "Pengaturan lanjutan", "passwordLabel": "Password", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index c6a6d0a1..7eacbc2e 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -25,6 +25,7 @@ "bufferLabel": "Memorizzazione offline", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Rilevamento arresto", + "preferPlatformProvidersLabel": "Utilizzare la posizione di sistema", "trackingLabel": "Tracciamento continuo", "advancedLabel": "Impostazioni avanzate", "passwordLabel": "Password", @@ -33,6 +34,6 @@ "startAction": "Avvia servizio", "stopAction": "Ferma servizio", "sosAction": "Invia SOS", - "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", - "configurationMessage": "Apply new configuration?" + "disclosureMessage": "Questa app raccoglie dati sulla posizione e sull'attività in background e li invia al server configurato.", + "configurationMessage": "Applicare la nuova configurazione?" } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 238ab204..c1495aa8 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -25,6 +25,7 @@ "bufferLabel": "オフラインバッファリング", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "継続追跡", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 59590a47..e4fe70c3 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -25,6 +25,7 @@ "bufferLabel": "오프라인 버퍼링", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "지속 추적", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/l10n/app_lt.arb b/lib/l10n/app_lt.arb index 4fcdef66..8bafbc14 100644 --- a/lib/l10n/app_lt.arb +++ b/lib/l10n/app_lt.arb @@ -25,6 +25,7 @@ "bufferLabel": "Kaupti duomenis neprisijungus", "wakelockLabel": "Pažadinimo užraktas", "stopDetectionLabel": "Stabdyti aptikimą", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Nuolatinis stebėjimas", "advancedLabel": "Papildomi nustatymai", "passwordLabel": "Slaptažodis", diff --git a/lib/l10n/app_lv.arb b/lib/l10n/app_lv.arb index dfb90875..7338a86a 100644 --- a/lib/l10n/app_lv.arb +++ b/lib/l10n/app_lv.arb @@ -25,6 +25,7 @@ "bufferLabel": "Bezsaistes buferizācija", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Apstāšanās noteikšana", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Nepārtraukta izsekošana", "advancedLabel": "Papildus iestatījumi", "passwordLabel": "Parole", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 0eedfbb3..a4e7e422 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -25,6 +25,7 @@ "bufferLabel": "Offline buffering", "wakelockLabel": "Wakelock", "stopDetectionLabel": "Stopdetectie", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Continu volgen", "advancedLabel": "Geavanceerde instellingen", "passwordLabel": "Password", diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index f4bb8f8f..46ef8e5f 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -25,6 +25,7 @@ "bufferLabel": "Buforowanie offline", "wakelockLabel": "Blokada uśpienia", "stopDetectionLabel": "Wykrywanie zatrzymania", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Ciągłe śledzenie", "advancedLabel": "Ustawienia zaawansowane", "passwordLabel": "Hasło", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 9d64c9af..55c2fe29 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -25,6 +25,7 @@ "bufferLabel": "Armazenamento em buffer offline", "wakelockLabel": "Bloqueio de despertar", "stopDetectionLabel": "Deteção de paragem", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Rastreio contínuo", "advancedLabel": "Definições avançadas", "passwordLabel": "Password", diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb index 0a04830a..876a02b9 100644 --- a/lib/l10n/app_pt_BR.arb +++ b/lib/l10n/app_pt_BR.arb @@ -25,6 +25,7 @@ "bufferLabel": "Buffer offline", "wakelockLabel": "Bloqueio de despertar", "stopDetectionLabel": "Detecção de parada", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Rastreamento contínuo", "advancedLabel": "Configurações avançadas", "passwordLabel": "Senha", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 92066941..a0e72a89 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -25,6 +25,7 @@ "bufferLabel": "Буферизация офлайн", "wakelockLabel": "Блокировка сна", "stopDetectionLabel": "Обнаружение остановки", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Непрерывное отслеживание", "advancedLabel": "Расширенные настройки", "passwordLabel": "Пароль", diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index 1a35cb1f..3894d24c 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -25,6 +25,7 @@ "bufferLabel": "Predpomnjenje brez povezave", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Neprekinjeno sledenje", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index 0ccf1caf..c5e7c7da 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -25,6 +25,7 @@ "bufferLabel": "การบัฟเฟอร์แบบออฟไลน์", "wakelockLabel": "ป้องกันไม่ให้อุปกรณ์เข้าสู่โหมดพัก", "stopDetectionLabel": "หยุดการตรวจจับ", + "preferPlatformProvidersLabel": "ใช้ตำแหน่งของระบบ", "trackingLabel": "ติดตามอย่างต่อเนื่อง", "advancedLabel": "การตั้งค่าขั้นสูง", "passwordLabel": "รหัสผ่าน", diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 3347f583..440d525e 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -25,6 +25,7 @@ "bufferLabel": "Çevrimdışı önbellekleme", "wakelockLabel": "Uyanık kilidi", "stopDetectionLabel": "Durma algılama", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Sürekli izleme", "advancedLabel": "Gelişmiş ayarlar", "passwordLabel": "Password", diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 4b0f7ba1..75722616 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -25,6 +25,7 @@ "bufferLabel": "Офлайн-буферизація", "wakelockLabel": "Wake lock", "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", "trackingLabel": "Безперервне відстеження", "advancedLabel": "Advanced settings", "passwordLabel": "Password", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index b10f2068..9f9c1e62 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -25,6 +25,7 @@ "bufferLabel": "离线缓冲", "wakelockLabel": "唤醒锁", "stopDetectionLabel": "停止检测", + "preferPlatformProvidersLabel": "使用系统位置", "trackingLabel": "持续追踪", "advancedLabel": "高级设置", "passwordLabel": "密码", @@ -34,5 +35,5 @@ "stopAction": "停止服务", "sosAction": "发送求救信号", "disclosureMessage": "该应用会在后台收集位置和活动数据,并将其发送到配置的服务器。", - "configurationMessage": "Apply new configuration?" + "configurationMessage": "应用新配置?" } diff --git a/lib/l10n/app_zh_TW.arb b/lib/l10n/app_zh_TW.arb index 63f5af4b..48b7d692 100644 --- a/lib/l10n/app_zh_TW.arb +++ b/lib/l10n/app_zh_TW.arb @@ -25,6 +25,7 @@ "bufferLabel": "離線緩存", "wakelockLabel": "喚醒鎖定", "stopDetectionLabel": "停止偵測", + "preferPlatformProvidersLabel": "使用系統位置", "trackingLabel": "持續追蹤", "advancedLabel": "進階設定", "passwordLabel": "密碼", @@ -34,5 +35,5 @@ "stopAction": "停止服務", "sosAction": "發送 SOS 求救", "disclosureMessage": "該應用程式會在背景收集位置和活動數據,並將其傳送到配置的伺服器。", - "configurationMessage": "Apply new configuration?" + "configurationMessage": "應用新配置?" } From 096ac0aed445d299b4d686f91adc11dc534004b8 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 9 Aug 2026 22:10:42 -0700 Subject: [PATCH 212/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 3b273cba..42469720 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.8+149 +version: 10.0.9+150 environment: sdk: ^3.7.2 From 7464f02ab097d1237504b61b554a2b344ca46a30 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 12 Aug 2026 07:37:40 -0700 Subject: [PATCH 213/235] Fix localization script --- .github/workflows/translation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/translation.yml b/.github/workflows/translation.yml index 3ae9e9f1..9f0c361e 100644 --- a/.github/workflows/translation.yml +++ b/.github/workflows/translation.yml @@ -18,7 +18,7 @@ jobs: for f in lib/l10n/*.arb; do [[ $f == */app_en.arb ]] && continue diff -q "$f" lib/l10n/app_en.arb && continue - git diff --quiet -- "$f" || git add "$f" + git add "$f" done git diff --cached --quiet || git commit -m "Update translations" git push From 005e354c6f4cc6cb87a63285cd034ebd19e0f29e Mon Sep 17 00:00:00 2001 From: Traccar Bot Date: Wed, 12 Aug 2026 14:38:32 +0000 Subject: [PATCH 214/235] Update translations --- lib/l10n/app_el.arb | 39 +++++++++++++++++++++++++++++++++++++++ lib/l10n/app_et.arb | 39 +++++++++++++++++++++++++++++++++++++++ lib/l10n/app_hr.arb | 39 +++++++++++++++++++++++++++++++++++++++ lib/l10n/app_nb.arb | 39 +++++++++++++++++++++++++++++++++++++++ lib/l10n/app_sk.arb | 39 +++++++++++++++++++++++++++++++++++++++ lib/l10n/app_sr.arb | 39 +++++++++++++++++++++++++++++++++++++++ lib/l10n/app_vi.arb | 39 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 273 insertions(+) create mode 100644 lib/l10n/app_el.arb create mode 100644 lib/l10n/app_et.arb create mode 100644 lib/l10n/app_hr.arb create mode 100644 lib/l10n/app_nb.arb create mode 100644 lib/l10n/app_sk.arb create mode 100644 lib/l10n/app_sr.arb create mode 100644 lib/l10n/app_vi.arb diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb new file mode 100644 index 00000000..b5e7b01e --- /dev/null +++ b/lib/l10n/app_el.arb @@ -0,0 +1,39 @@ +{ + "trackingTitle": "Παρακολούθηση", + "settingsTitle": "Ρυθμίσεις", + "statusTitle": "Καταγραφές", + "saveButton": "Αποθήκευση", + "cancelButton": "Ακύρωση", + "okButton": "Αποδοχή", + "locationButton": "Αποστολή τοποθεσίας", + "statusButton": "Εμφάνιση κατάστασης", + "settingsButton": "Αλλαγή ρυθμίσεων", + "invalidValue": "Μη έγκυρη τιμή", + "disabledValue": "Απενεργοποιημένο", + "idLabel": "Αναγνωριστικό συσκευής", + "urlLabel": "URL διακομιστή", + "accuracyLabel": "Ακρίβεια τοποθεσίας", + "highestAccuracyLabel": "Μέγιστο", + "highAccuracyLabel": "Υψηλό", + "mediumAccuracyLabel": "Μεσαίο", + "lowAccuracyLabel": "Χαμηλό", + "intervalLabel": "Διάστημα (δευτερόλεπτα)", + "fastestIntervalLabel": "Ταχύτερο διάστημα (δευτερόλεπτα)", + "distanceLabel": "Απόσταση (μέτρα)", + "angleLabel": "Γωνία (μοίρες)", + "heartbeatLabel": "Καρδιακοί παλμοί σε ηρεμία (δευτερόλεπτα)", + "bufferLabel": "Αποθήκευση ενδιάμεσων δεδομένων εκτός σύνδεσης", + "wakelockLabel": "Κλείδωμα αφύπνισης", + "stopDetectionLabel": "Διακοπή ανίχνευσης", + "preferPlatformProvidersLabel": "Χρήση τοποθεσίας συστήματος", + "trackingLabel": "Συνεχής παρακολούθηση", + "advancedLabel": "Προχωρημένες ρυθμίσεις", + "passwordLabel": "Κωδικός πρόσβασης", + "optimizationMessage": "Για να διασφαλιστεί η αξιόπιστη παρακολούθηση, παρακαλούμε απενεργοποιήστε τη βελτιστοποίηση μπαταρίας για αυτήν την εφαρμογή.", + "passwordError": "Λανθασμένος κωδικός", + "startAction": "Έναρξη υπηρεσίας", + "stopAction": "Διακοπή υπηρεσίας", + "sosAction": "Αποστολή SOS", + "disclosureMessage": "Αυτή η εφαρμογή συλλέγει δεδομένα τοποθεσίας και δραστηριότητας στο παρασκήνιο και τα αποστέλλει στον διαμορφωμένο διακομιστή.", + "configurationMessage": "Εφαρμογή νέων ρυθμίσεων;" +} diff --git a/lib/l10n/app_et.arb b/lib/l10n/app_et.arb new file mode 100644 index 00000000..45d2825b --- /dev/null +++ b/lib/l10n/app_et.arb @@ -0,0 +1,39 @@ +{ + "trackingTitle": "Jälgimine", + "settingsTitle": "Seaded", + "statusTitle": "Logid", + "saveButton": "Salvesta", + "cancelButton": "Tühista", + "okButton": "OK", + "locationButton": "Saada asukoht", + "statusButton": "Näita olekut", + "settingsButton": "Muuda seadeid", + "invalidValue": "Vigane väärtus", + "disabledValue": "Välja lülitatud", + "idLabel": "Seadme identifikaator", + "urlLabel": "Serveri URL", + "accuracyLabel": "Asukoha täpsus", + "highestAccuracyLabel": "Kõrgeim", + "highAccuracyLabel": "Kõrge", + "mediumAccuracyLabel": "Keskmine", + "lowAccuracyLabel": "Madal", + "intervalLabel": "Intervall (sekundites)", + "fastestIntervalLabel": "Kiireim intervall (sekundites)", + "distanceLabel": "Vahemaa (meetrites)", + "angleLabel": "Nurk (kraadides)", + "heartbeatLabel": "Statsionaarne südamelöök (sekundites)", + "bufferLabel": "Võrguühenduseta puhverdamine", + "wakelockLabel": "Hoia seade ärkvel", + "stopDetectionLabel": "Peatuse tuvastamine", + "preferPlatformProvidersLabel": "Use system location", + "trackingLabel": "Pidev jälgimine", + "advancedLabel": "Täpsemad seaded", + "passwordLabel": "Parool", + "optimizationMessage": "Usaldusväärse jälgimise tagamiseks palun keela selle rakenduse aku optimeerimine.", + "passwordError": "Vale parool", + "startAction": "Käivita teenus", + "stopAction": "Peata teenus", + "sosAction": "Saada SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" +} diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb new file mode 100644 index 00000000..1fddbc7f --- /dev/null +++ b/lib/l10n/app_hr.arb @@ -0,0 +1,39 @@ +{ + "trackingTitle": "Praćenje", + "settingsTitle": "Postavke", + "statusTitle": " Zapisi", + "saveButton": "Spremi", + "cancelButton": "Odustani", + "okButton": "U redu", + "locationButton": "Pošalji lokaciju", + "statusButton": "Prikaži status", + "settingsButton": "Promijeni postavke", + "invalidValue": "Neispravna vrijednost", + "disabledValue": "Onemogućeno", + "idLabel": "Identifikator uređaja", + "urlLabel": "Adresa poslužitelja", + "accuracyLabel": "Točnost lokacije", + "highestAccuracyLabel": "Najviše", + "highAccuracyLabel": "Visoko", + "mediumAccuracyLabel": "Srednje", + "lowAccuracyLabel": "Nisko", + "intervalLabel": "Interval (sekunde)", + "fastestIntervalLabel": "Najbrži interval (sekunde)", + "distanceLabel": "Udaljenost (metri)", + "angleLabel": "Kut (stupnjevi)", + "heartbeatLabel": "Otkucaji u mirovanju (sekunde)", + "bufferLabel": "Izvanmrežno memoriranje", + "wakelockLabel": "Sprječavanje gašenja ekrana", + "stopDetectionLabel": "Detekcija zaustavljanja", + "preferPlatformProvidersLabel": "Use system location", + "trackingLabel": "Neprekidno praćenje", + "advancedLabel": "Napredne postavke", + "passwordLabel": "Password", + "optimizationMessage": "Za pouzdano praćenje, onemogućite optimizaciju baterije za ovu aplikaciju.", + "passwordError": "Wrong password", + "startAction": "Pokreni servis", + "stopAction": "Zaustavi servis", + "sosAction": "Pošalji SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" +} diff --git a/lib/l10n/app_nb.arb b/lib/l10n/app_nb.arb new file mode 100644 index 00000000..155a3178 --- /dev/null +++ b/lib/l10n/app_nb.arb @@ -0,0 +1,39 @@ +{ + "trackingTitle": "Sporing", + "settingsTitle": "Innstillinger", + "statusTitle": "Logger", + "saveButton": "Lagre", + "cancelButton": "Avbryt", + "okButton": "OK", + "locationButton": "Send location", + "statusButton": "Vis status", + "settingsButton": "Change settings", + "invalidValue": "Invalid value", + "disabledValue": "Disabled", + "idLabel": "Device identifier", + "urlLabel": "Server URL", + "accuracyLabel": "Location accuracy", + "highestAccuracyLabel": "Highest", + "highAccuracyLabel": "High", + "mediumAccuracyLabel": "Medium", + "lowAccuracyLabel": "Low", + "intervalLabel": "Interval (seconds)", + "fastestIntervalLabel": "Fastest interval (seconds)", + "distanceLabel": "Distance (meters)", + "angleLabel": "Angle (degrees)", + "heartbeatLabel": "Stationary heartbeat (seconds)", + "bufferLabel": "Offline buffering", + "wakelockLabel": "Wake lock", + "stopDetectionLabel": "Stop detection", + "preferPlatformProvidersLabel": "Use system location", + "trackingLabel": "Continuous tracking", + "advancedLabel": "Advanced settings", + "passwordLabel": "Passord", + "optimizationMessage": "To ensure reliable tracking, please disable battery optimization for this app.", + "passwordError": "Feil passord", + "startAction": "Start tjeneste", + "stopAction": "Stopp tjeneste", + "sosAction": "Send SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" +} diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb new file mode 100644 index 00000000..5b02a6c2 --- /dev/null +++ b/lib/l10n/app_sk.arb @@ -0,0 +1,39 @@ +{ + "trackingTitle": "Sledovanie", + "settingsTitle": "Nastavenia", + "statusTitle": "Logy", + "saveButton": "Uložiť", + "cancelButton": "Zrušiť", + "okButton": "OK", + "locationButton": "Odoslať polohu", + "statusButton": "Zobraziť stav", + "settingsButton": "Zmeniť nastavenia", + "invalidValue": "Nesprávna hodnota", + "disabledValue": "Vypnuté", + "idLabel": "Identifikátor zariadenia", + "urlLabel": "URL servera", + "accuracyLabel": "Presnosť lokalizácie", + "highestAccuracyLabel": "Najvyššia", + "highAccuracyLabel": "Vysoká", + "mediumAccuracyLabel": "Stredná", + "lowAccuracyLabel": "Nízka", + "intervalLabel": "Interval (sekundy)", + "fastestIntervalLabel": "Najrýchlejší interval (sekundy)", + "distanceLabel": "Vzdialenosť (metre)", + "angleLabel": "Uhol (stupne)", + "heartbeatLabel": "Stationary heartbeat (seconds)", + "bufferLabel": "Offline ukladanie do pamäte", + "wakelockLabel": "Uzamknutie prebudenia", + "stopDetectionLabel": "Zastaviť detekciu", + "preferPlatformProvidersLabel": "Use system location", + "trackingLabel": "Nepretržité sledovanie", + "advancedLabel": "Rozšírené nastavenia", + "passwordLabel": "Heslo", + "optimizationMessage": "Pre zabezpečenie spoľahlivého sledovania vypnite optimalizáciu batérie pre túto aplikáciu.", + "passwordError": "Nesprávne heslo", + "startAction": "Spustiť službu", + "stopAction": "Zastaviť službu", + "sosAction": "Poslať SOS", + "disclosureMessage": "This app collects location and activity data in the background and sends it to the configured server.", + "configurationMessage": "Apply new configuration?" +} diff --git a/lib/l10n/app_sr.arb b/lib/l10n/app_sr.arb new file mode 100644 index 00000000..cbfad480 --- /dev/null +++ b/lib/l10n/app_sr.arb @@ -0,0 +1,39 @@ +{ + "trackingTitle": "Praćenje", + "settingsTitle": "Podešavanja", + "statusTitle": "Log", + "saveButton": "Sačuvaj", + "cancelButton": "Otkaži", + "okButton": "OK", + "locationButton": "Pošalji lokaciju", + "statusButton": "Pokaži satus", + "settingsButton": "Promeni status", + "invalidValue": "Neispravna vreednost", + "disabledValue": "Onemogućeno", + "idLabel": "Broj uređaja", + "urlLabel": "URL servera", + "accuracyLabel": "Preciznost lokacije", + "highestAccuracyLabel": "Najpreciznije", + "highAccuracyLabel": "Visoka", + "mediumAccuracyLabel": "Srednja", + "lowAccuracyLabel": "Niska", + "intervalLabel": "Interval (sekunde)", + "fastestIntervalLabel": "Najbrži interval (sekunde)", + "distanceLabel": "Razdaljina (metara)", + "angleLabel": "Ugao ( stepeni)", + "heartbeatLabel": "Interval stajanja (sekunde)", + "bufferLabel": "Offline učitavanje", + "wakelockLabel": "Wake lock", + "stopDetectionLabel": "Detekcija zaustavljanja", + "preferPlatformProvidersLabel": "Koristi lokaciju sistema", + "trackingLabel": "Kontinualno praćenje", + "advancedLabel": "Napredna podešavanja\n", + "passwordLabel": "Lozinka", + "optimizationMessage": "Da biste osigurali pouzdano praćenje, onemogućite optimizaciju baterije za ovu aplikaciju.", + "passwordError": "Pogrešna lozinka", + "startAction": "Uključi servis", + "stopAction": "Zaustavi servis", + "sosAction": "Pošalji SOS", + "disclosureMessage": "Ova aplikacija prikuplja podatke o lokaciji i aktivnostima u pozadini i šalje ih na konfigurisani server.", + "configurationMessage": "Postaviti nova podešavanja?" +} diff --git a/lib/l10n/app_vi.arb b/lib/l10n/app_vi.arb new file mode 100644 index 00000000..fd41e553 --- /dev/null +++ b/lib/l10n/app_vi.arb @@ -0,0 +1,39 @@ +{ + "trackingTitle": "Theo dõi", + "settingsTitle": "Cài đặt", + "statusTitle": "Nhật ký", + "saveButton": "Lưu", + "cancelButton": "Hủy", + "okButton": "OK", + "locationButton": "Gửi vị trí", + "statusButton": "Hiện trạng thái", + "settingsButton": "Thay đổi cài đặt", + "invalidValue": "Giá trị không hợp lệ", + "disabledValue": "Đã tắt", + "idLabel": "Mã định danh thiết bị", + "urlLabel": "URL máy chủ", + "accuracyLabel": "Độ chính xác vị trí", + "highestAccuracyLabel": "Cao nhất", + "highAccuracyLabel": "Cao", + "mediumAccuracyLabel": "Trung bình", + "lowAccuracyLabel": "Thấp", + "intervalLabel": "Khoảng thời gian (giây)", + "fastestIntervalLabel": "Khoảng thời gian nhanh nhất (giây)", + "distanceLabel": "Khoảng cách (mét)", + "angleLabel": "Góc (độ)", + "heartbeatLabel": "Tín hiệu duy trì khi đứng yên (giây)", + "bufferLabel": "Bộ đệm ngoại tuyến", + "wakelockLabel": "Duy trì hoạt động", + "stopDetectionLabel": "Phát hiện dừng", + "preferPlatformProvidersLabel": "Sử dụng vị trí hệ thống", + "trackingLabel": "Theo dõi liên tục", + "advancedLabel": "Cài đặt nâng cao", + "passwordLabel": "Mật khẩu", + "optimizationMessage": "Để đảm bảo việc theo dõi hoạt động ổn định, vui lòng tắt tối ưu hóa pin cho ứng dụng này.", + "passwordError": "Sai mật khẩu", + "startAction": "Bắt đầu dịch vụ", + "stopAction": "Dừng dịch vụ", + "sosAction": "Gửi SOS", + "disclosureMessage": "Ứng dụng này thu thập dữ liệu vị trí và hoạt động ở chế độ nền và gửi đến máy chủ đã cấu hình.", + "configurationMessage": "Áp dụng cấu hình mới?" +} From 0bdfc5978a405876c9a8509d311fa48a73bed535 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 12 Aug 2026 08:03:42 -0700 Subject: [PATCH 215/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 42469720..c279f4b1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^1.0.8 + traccar_client_sdk: ^1.0.9 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ">=16.2.2 <16.4.2" From 7b27df59d6ecf14c589697e6063e529e51718831 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 12 Aug 2026 08:04:01 -0700 Subject: [PATCH 216/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c279f4b1..eda4218b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.9+150 +version: 10.0.10+151 environment: sdk: ^3.7.2 From 24cb26cc30d6f1c83697981da863e02fc8127603 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 13 Aug 2026 19:31:05 +0000 Subject: [PATCH 217/235] Update SDK version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index eda4218b..9d58762e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^1.0.9 + traccar_client_sdk: ^1.0.10 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ">=16.2.2 <16.4.2" From 5f6d57665f1981ebb1e445db7d5acd8c5f9e25ad Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 13 Aug 2026 19:31:16 +0000 Subject: [PATCH 218/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 9d58762e..918a9804 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.10+151 +version: 10.0.11+152 environment: sdk: ^3.7.2 From f699c24c2bb8aab5bc3141756a957fe18e78caf8 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 13 Aug 2026 19:41:20 +0000 Subject: [PATCH 219/235] Update android plugin --- android/settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 67008d7a..8118b68d 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -23,7 +23,7 @@ plugins { id("com.google.gms.google-services") version("4.4.4") apply false id("com.google.firebase.crashlytics") version("3.0.6") apply false // END: FlutterFire Configuration - id("org.jetbrains.kotlin.android") version "2.2.10" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false } include(":app") From 5062bc6c490a654b8166d03406c60f904a02234c Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 13 Aug 2026 19:41:36 +0000 Subject: [PATCH 220/235] Update app code --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 918a9804..d3311098 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.11+152 +version: 10.0.11+153 environment: sdk: ^3.7.2 From 90693e8d016a381e5ac704dbaef92acffeb05c60 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 15 Aug 2026 03:45:35 +0000 Subject: [PATCH 221/235] Support MDM managed configuration --- lib/configuration_service.dart | 47 ++++++++++++++++++--------------- lib/main.dart | 2 ++ lib/managed_config_service.dart | 26 ++++++++++++++++++ pubspec.yaml | 1 + 4 files changed, 55 insertions(+), 21 deletions(-) create mode 100644 lib/managed_config_service.dart diff --git a/lib/configuration_service.dart b/lib/configuration_service.dart index b48c8793..3fd47e9d 100644 --- a/lib/configuration_service.dart +++ b/lib/configuration_service.dart @@ -3,15 +3,20 @@ import 'preferences.dart'; class ConfigurationService { static Future applyUri(Uri uri) async { - if (uri.scheme == 'http' || uri.scheme == 'https') { - await Preferences.instance.setString(Preferences.url, '${uri.origin}${uri.path}'); - } else { - final url = uri.queryParameters['url']; - if (url != null) { - await Preferences.instance.setString(Preferences.url, url); - } + final url = (uri.scheme == 'http' || uri.scheme == 'https') + ? '${uri.origin}${uri.path}' + : uri.queryParameters['url']; + await applyParameters(uri.queryParameters, url: url); + } + + static Future applyManagedConfig(Map config) async { + await applyParameters(config, url: config[Preferences.url]?.toString()); + } + + static Future applyParameters(Map parameters, {String? url}) async { + if (url != null) { + await Preferences.instance.setString(Preferences.url, url); } - final parameters = uri.queryParameters; await _applyStringParameter(parameters, Preferences.id); await _applyStringParameter(parameters, Preferences.accuracy); await _applyIntParameter(parameters, Preferences.distance); @@ -26,29 +31,29 @@ class ConfigurationService { } static Future _applyStringParameter( - Map parameters, String key) async { + Map parameters, String key) async { final value = parameters[key]; if (value != null) { - await Preferences.instance.setString(key, value); + await Preferences.instance.setString(key, value.toString()); } } static Future _applyIntParameter( - Map parameters, String key) async { - final stringValue = parameters[key]; - if (stringValue != null) { - final value = int.tryParse(stringValue); - if (value != null) { - await Preferences.instance.setInt(key, value); - } + Map parameters, String key) async { + final raw = parameters[key]; + final value = raw is int ? raw : int.tryParse(raw?.toString() ?? ''); + if (value != null) { + await Preferences.instance.setInt(key, value); } } static Future _applyBoolParameter( - Map parameters, String key) async { - final value = parameters[key]; - if (value != null) { - switch (value) { + Map parameters, String key) async { + final raw = parameters[key]; + if (raw is bool) { + await Preferences.instance.setBool(key, raw); + } else if (raw is String) { + switch (raw) { case 'false': await Preferences.instance.setBool(key, false); case 'true': diff --git a/lib/main.dart b/lib/main.dart index 5e21b0e5..c81987cc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,6 +15,7 @@ import 'configuration_service.dart'; import 'geolocation_service.dart'; import 'l10n/app_localizations.dart'; import 'main_screen.dart'; +import 'managed_config_service.dart'; import 'preferences.dart'; final messengerKey = GlobalKey(); @@ -32,6 +33,7 @@ void main() async { await GeolocationService.tracker.init(Preferences.buildConfig()); await PasswordService.migrate(); await PushService.init(); + await ManagedConfigService.init(); runApp(const MainApp()); } diff --git a/lib/managed_config_service.dart b/lib/managed_config_service.dart new file mode 100644 index 00000000..95d33bbd --- /dev/null +++ b/lib/managed_config_service.dart @@ -0,0 +1,26 @@ +import 'dart:async'; +import 'dart:developer' as developer; + +import 'package:managed_configurations/managed_configurations.dart'; + +import 'configuration_service.dart'; + +class ManagedConfigService { + static final ManagedConfigurations _managedConfigurations = ManagedConfigurations(); + + static Future init() async { + try { + final config = await _managedConfigurations.getManagedConfigurations; + if (config != null && config.isNotEmpty) { + await ConfigurationService.applyManagedConfig(config); + } + } catch (error) { + developer.log('Failed to read managed configuration', error: error); + } + _managedConfigurations.mangedConfigurationsStream.listen((config) { + if (config != null && config.isNotEmpty) { + ConfigurationService.applyManagedConfig(config); + } + }); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index d3311098..6e8ed3e2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -26,6 +26,7 @@ dependencies: app_links: ^7.0.0 app_settings: ^8.0.3 share_plus: ^13.3.0 + managed_configurations: ^1.2.0 dev_dependencies: flutter_test: From 3e4ebef229b05ad4af3a212389cdb90169d683cf Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 15 Aug 2026 04:12:38 +0000 Subject: [PATCH 222/235] Refresh screen on deeplink (fix #209) --- lib/main.dart | 8 +++++--- lib/main_screen.dart | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index c81987cc..004c0a2e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -20,6 +20,7 @@ import 'preferences.dart'; final messengerKey = GlobalKey(); final navigatorKey = GlobalKey(); +final mainScreenKey = GlobalKey(); void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -98,6 +99,7 @@ class _MainAppState extends State { ); if (confirmed == true) { await ConfigurationService.applyUri(uri); + mainScreenKey.currentState?.refresh(); } } @@ -121,9 +123,9 @@ class _MainAppState extends State { ), ), home: Stack( - children: const [ - QuickActionsInitializer(), - MainScreen(), + children: [ + const QuickActionsInitializer(), + MainScreen(key: mainScreenKey), ], ), ); diff --git a/lib/main_screen.dart b/lib/main_screen.dart index f624eb8f..4680c549 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -16,10 +16,10 @@ class MainScreen extends StatefulWidget { const MainScreen({super.key}); @override - State createState() => _MainScreenState(); + State createState() => MainScreenState(); } -class _MainScreenState extends State with WidgetsBindingObserver { +class MainScreenState extends State with WidgetsBindingObserver { bool trackingEnabled = false; @override @@ -50,6 +50,8 @@ class _MainScreenState extends State with WidgetsBindingObserver { }); } + void refresh() => setState(() {}); + Widget _buildTrackingCard() { return Card( child: Padding( From 0242bc259d14a476cfd497dd01686b97ca8905d8 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 15 Aug 2026 04:13:14 +0000 Subject: [PATCH 223/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 6e8ed3e2..f87461e4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.11+153 +version: 10.0.12+154 environment: sdk: ^3.7.2 From e150af47b1ec41c7667cc4ed62a82ba1267ba73c Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 19 Aug 2026 23:44:45 +0000 Subject: [PATCH 224/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f87461e4..f66159ec 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.12+154 +version: 10.0.13+155 environment: sdk: ^3.7.2 From 8697b13102a9e5541adf3c1cf6edbf9dc43fac9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 07:01:13 -0700 Subject: [PATCH 225/235] Bump app_settings from 8.0.3 to 9.0.0 (#210) Bumps [app_settings](https://github.com/spencerccf/app_settings) from 8.0.3 to 9.0.0. - [Release notes](https://github.com/spencerccf/app_settings/releases) - [Changelog](https://github.com/spencerccf/app_settings/blob/master/CHANGELOG.md) - [Commits](https://github.com/spencerccf/app_settings/commits) --- updated-dependencies: - dependency-name: app_settings dependency-version: 9.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f66159ec..0806266e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: mobile_scanner: ^7.4.0 flutter_secure_storage: ^11.0.0 app_links: ^7.0.0 - app_settings: ^8.0.3 + app_settings: ^9.0.0 share_plus: ^13.3.0 managed_configurations: ^1.2.0 From e17d831a4d38e0432fcd326f8b1c0fb0f04fbea5 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 20 Aug 2026 07:20:10 -0700 Subject: [PATCH 226/235] Update dependencies --- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index f6776cd4..f96fe5da 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -122,8 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/traccar/traccar-client-sdk.git", "state" : { - "revision" : "22af2133fc76f9f40b17b2f3ab878237dcc02e46", - "version" : "1.0.8" + "revision" : "70866d56c36a7a3f6f417e2a89487257221513dc", + "version" : "1.0.10" } } ], From ebcb085ebde0963f7e1fa5fbbc74d721062bb7fd Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 20 Aug 2026 07:20:26 -0700 Subject: [PATCH 227/235] Add SOS button --- lib/main_screen.dart | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/main_screen.dart b/lib/main_screen.dart index 4680c549..303a6198 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -110,8 +110,9 @@ class MainScreenState extends State with WidgetsBindingObserver { }, ), const SizedBox(height: 8), - OverflowBar( + Wrap( spacing: 8, + runSpacing: 8, children: [ FilledButton.tonal( onPressed: () async { @@ -123,6 +124,20 @@ class MainScreenState extends State with WidgetsBindingObserver { }, child: Text(AppLocalizations.of(context)!.locationButton), ), + FilledButton.tonal( + style: FilledButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.errorContainer, + foregroundColor: Theme.of(context).colorScheme.onErrorContainer, + ), + onPressed: () async { + try { + await GeolocationService.tracker.requestPosition(alarm: 'sos'); + } on PlatformException { + // permission denied or location error + } + }, + child: Text(AppLocalizations.of(context)!.sosAction), + ), FilledButton.tonal( onPressed: () { Navigator.push(context, MaterialPageRoute(builder: (_) => const StatusScreen())); @@ -155,8 +170,9 @@ class MainScreenState extends State with WidgetsBindingObserver { subtitle: Text(Preferences.instance.getString(Preferences.url) ?? ''), ), const SizedBox(height: 8), - OverflowBar( + Wrap( spacing: 8, + runSpacing: 8, children: [ FilledButton.tonal( onPressed: () async { From 2c5cd8fdba9d286f0862496632cc15c33d6bd872 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 22 Aug 2026 04:17:32 -0700 Subject: [PATCH 228/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 0806266e..3f1ab8ac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.0.13+155 +version: 10.1.0+156 environment: sdk: ^3.7.2 From f355a9e82ea3c1d97883e4ff4a24a77c666ad6d0 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 30 Aug 2026 21:21:09 -0700 Subject: [PATCH 229/235] Update readme file --- README.md | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 96046413..e01814e3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # [Traccar Client app](https://www.traccar.org/client) -[![Get it on Google Play](http://www.tananaev.com/badges/google-play.svg)](https://play.google.com/store/apps/details?id=org.traccar.client) [![Download on the App Store](http://www.tananaev.com/badges/app-store.svg)](https://itunes.apple.com/app/traccar-client/id843156974) +[![Get it on Google Play](https://www.tananaev.com/badges/google-play.svg)](https://play.google.com/store/apps/details?id=org.traccar.client) [![Download on the App Store](https://www.tananaev.com/badges/app-store.svg)](https://itunes.apple.com/app/traccar-client/id843156974) ## Overview -Traccar Client is a GPS tracking app for Android and iOS. It runs in the background and sends location updates to your own server using the open-source Traccar platform. +Traccar Client is a GPS tracking app for Android and iOS. It runs in the background and sends location updates to your own server running [Traccar](https://github.com/traccar/traccar), the open-source GPS tracking platform. - **Real-time Tracking**: See your device’s location on your private server in real time. - **Open-Source**: 100% free and open-source, with no ads or tracking. @@ -14,22 +14,21 @@ Traccar Client is a GPS tracking app for Android and iOS. It runs in the backgro Just enter your server address, grant location permissions, and the app will automatically send periodic location reports in the background. -## Team +Don't have a Traccar server yet? [Try the live demo](https://www.traccar.org/demo-server/) or see the [installation guides](https://www.traccar.org/install-vps/) to set up your own for free. -- Anton Tananaev ([anton@traccar.org](mailto:anton@traccar.org)) +## Build -## License +Standard Flutter project: - Apache License, Version 2.0 +```shell +flutter pub get +flutter run +``` - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +## Team - http://www.apache.org/licenses/LICENSE-2.0 +- Anton Tananaev ([anton@traccar.org](mailto:anton@traccar.org)) + +## License - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Apache License, Version 2.0. See [LICENSE.txt](https://github.com/traccar/traccar-client/blob/master/LICENSE.txt) for details. From 838652ceec6743e2bfa40734701b4bfc896d2e50 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 31 Aug 2026 07:50:31 -0700 Subject: [PATCH 230/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 3f1ab8ac..496e7317 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.1.0+156 +version: 10.1.1+157 environment: sdk: ^3.7.2 From 5137c8ea919d9e88ad07f6da5cb90f8fe231fe5d Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 31 Aug 2026 21:01:00 -0700 Subject: [PATCH 231/235] Update readme file --- .github/screenshot.png | Bin 0 -> 40426 bytes README.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 .github/screenshot.png diff --git a/.github/screenshot.png b/.github/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..019f7ccbc3964b692ee4be77a57a4b0dc04c3457 GIT binary patch literal 40426 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index e01814e3..b4c52495 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ Just enter your server address, grant location permissions, and the app will aut Don't have a Traccar server yet? [Try the live demo](https://www.traccar.org/demo-server/) or see the [installation guides](https://www.traccar.org/install-vps/) to set up your own for free. +Traccar Client app + ## Build Standard Flutter project: From 320d9d9c771d9232442a8d6f59f8ac793c42305a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 31 Aug 2026 21:17:42 -0700 Subject: [PATCH 232/235] Update readme file --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b4c52495..6fb59ecf 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,9 @@ Just enter your server address, grant location permissions, and the app will aut Don't have a Traccar server yet? [Try the live demo](https://www.traccar.org/demo-server/) or see the [installation guides](https://www.traccar.org/install-vps/) to set up your own for free. -Traccar Client app +| Client App | +|---| +| Traccar Client app | ## Build From ead1dab01de94ab8ecdd0204c0bdc20200c25020 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 4 Sep 2026 06:19:18 -0700 Subject: [PATCH 233/235] Export logs as file --- lib/status_screen.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/status_screen.dart b/lib/status_screen.dart index 242d81ef..5606add7 100644 --- a/lib/status_screen.dart +++ b/lib/status_screen.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -53,7 +54,12 @@ class _StatusScreenState extends State { final t = DateTime.fromMillisecondsSinceEpoch(entry.time); return '${_fullFormat.format(t)} ${entry.message}'; }).join('\n'); - await SharePlus.instance.share(ShareParams(text: text)); + final box = context.findRenderObject() as RenderBox; + await SharePlus.instance.share(ShareParams( + files: [XFile.fromData(utf8.encode(text), mimeType: 'text/plain')], + fileNameOverrides: const ['logs.txt'], + sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size, + )); } Future _clearLogs() async { From 61c094bf12070352160a7df6d1d37aa042f3d3fa Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 5 Sep 2026 06:44:48 -0700 Subject: [PATCH 234/235] Add location to heartbeat (fix #197) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 496e7317..bcf6e17b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter intl: any - traccar_client_sdk: ^1.0.10 + traccar_client_sdk: ^1.0.11 shared_preferences: ^2.5.5 firebase_core: ^4.9.0 firebase_messaging: ">=16.2.2 <16.4.2" From 29d94174ee47e65a70db7e2cbe2c7d2992b084a7 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 5 Sep 2026 06:45:13 -0700 Subject: [PATCH 235/235] Update app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index bcf6e17b..57ac2eba 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: traccar_client description: "Traccar Client" publish_to: 'none' -version: 10.1.1+157 +version: 10.1.2+158 environment: sdk: ^3.7.2