diff --git a/android/app/src/main/res/drawable/exclamation.xml b/android/app/src/main/res/drawable/exclamation.xml
new file mode 100644
index 0000000..98a9859
--- /dev/null
+++ b/android/app/src/main/res/drawable/exclamation.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/android/app/src/main/res/drawable/play.xml b/android/app/src/main/res/drawable/play.xml
new file mode 100644
index 0000000..d415ad1
--- /dev/null
+++ b/android/app/src/main/res/drawable/play.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/android/app/src/main/res/drawable/stop.xml b/android/app/src/main/res/drawable/stop.xml
new file mode 100644
index 0000000..408ee77
--- /dev/null
+++ b/android/app/src/main/res/drawable/stop.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 414a742..cc62d21 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -153,6 +153,8 @@ PODS:
- PromisesObjC (2.4.0)
- PromisesSwift (2.4.0):
- PromisesObjC (= 2.4.0)
+ - quick_actions_ios (0.0.1):
+ - Flutter
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
@@ -165,6 +167,7 @@ DEPENDENCIES:
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`)
- flutter_background_geolocation (from `.symlinks/plugins/flutter_background_geolocation/ios`)
+ - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
SPEC REPOS:
@@ -202,6 +205,8 @@ EXTERNAL SOURCES:
:path: Flutter
flutter_background_geolocation:
:path: ".symlinks/plugins/flutter_background_geolocation/ios"
+ quick_actions_ios:
+ :path: ".symlinks/plugins/quick_actions_ios/ios"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
@@ -230,6 +235,7 @@ SPEC CHECKSUMS:
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
+ quick_actions_ios: 4b07fb49d8d8f3518d7565fbb7a91014067a7d82
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
PODFILE CHECKSUM: f8c2dcdfb50bb67645580d28a6bf814fca30bdec
diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb
index 719cd42..2519c72 100644
--- a/lib/l10n/app_en.arb
+++ b/lib/l10n/app_en.arb
@@ -17,5 +17,8 @@
"intervalLabel": "Frequency",
"distanceLabel": "Distance",
"bufferLabel": "Offline buffering",
- "trackingLabel": "Continuous tracking"
+ "trackingLabel": "Continuous tracking",
+ "startAction": "Start service",
+ "stopAction": "Stop service",
+ "sosAction": "Send SOS"
}
diff --git a/lib/main.dart b/lib/main.dart
index 1e7f998..78c1d85 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg;
+import 'package:traccar_client/quick_actions.dart';
import 'main_screen.dart';
import 'preferences.dart';
@@ -25,7 +26,12 @@ class MainApp extends StatelessWidget {
seedColor: Colors.green,
),
),
- home: MainScreen(),
+ home: Stack(
+ children: const [
+ QuickActionsInitializer(),
+ MainScreen(),
+ ],
+ ),
);
}
}
diff --git a/lib/quick_actions.dart b/lib/quick_actions.dart
new file mode 100644
index 0000000..21938b9
--- /dev/null
+++ b/lib/quick_actions.dart
@@ -0,0 +1,48 @@
+import 'dart:developer' as developer;
+
+import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:quick_actions/quick_actions.dart';
+
+class QuickActionsInitializer extends StatefulWidget {
+ const QuickActionsInitializer({super.key});
+
+ @override
+ State createState() => _QuickActionsInitializerState();
+}
+
+class _QuickActionsInitializerState extends State {
+ final QuickActions quickActions = QuickActions();
+
+ @override
+ void initState() {
+ super.initState();
+ quickActions.initialize((shortcutType) {
+ developer.log('action $shortcutType');
+ switch (shortcutType) {
+ case 'start':
+ break;
+ case 'stop':
+ break;
+ case 'sos':
+ break;
+ }
+ });
+ }
+
+ @override
+ void didChangeDependencies() {
+ super.didChangeDependencies();
+ final localizations = AppLocalizations.of(context)!;
+ quickActions.setShortcutItems([
+ ShortcutItem(type: 'sos', localizedTitle: localizations.sosAction, icon: 'exclamation'),
+ ShortcutItem(type: 'stop', localizedTitle: localizations.stopAction, icon: 'stop'),
+ ShortcutItem(type: 'start', localizedTitle: localizations.startAction, icon: 'play'),
+ ]);
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return const SizedBox.shrink();
+ }
+}
diff --git a/pubspec.lock b/pubspec.lock
index 179570a..7f8f4c2 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -317,6 +317,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.8"
+ 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: "8d88e90a236ffe92f1026ecc3b85acfefedffccb0c1be1c94c1c0298e8483ad8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.21"
+ quick_actions_ios:
+ dependency: transitive
+ description:
+ name: quick_actions_ios
+ sha256: "837b7e6b5973784d3da56b8c959b446b215914f20405d88cd7d22a2fb94e4e4c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.0"
+ quick_actions_platform_interface:
+ dependency: transitive
+ description:
+ name: quick_actions_platform_interface
+ sha256: "1fec7068db5122cd019e9340d3d7be5d36eab099695ef3402c7059ee058329a4"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
shared_preferences:
dependency: "direct main"
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index e595e89..3626840 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -18,6 +18,7 @@ dependencies:
firebase_messaging: ^15.2.5
firebase_analytics: ^11.4.5
firebase_crashlytics: ^4.3.5
+ quick_actions: ^1.1.0
dev_dependencies:
flutter_test: