feat: Implement command queue for BLE command handling

- Added BleCommandQueue to manage command serialization and responses in BleCommandSender.
- Updated writeData, writeDataAndWaitForAck, and writeDataAndWaitForResponse methods to utilize the command queue.
- Enhanced BleResponseHandler to complete commands based on responses received from the BLE device.
- Introduced new commands for channel management, including getChannel and setChannel.
- Created LocationTrailLayer and TrailControls widgets for displaying and managing location trails on the map.
- Added PermissionRequestDialog to handle location permission requests on app startup.
- Updated LocationTrackingService to allow GPS tracking without a BLE connection.
This commit is contained in:
Janez T
2025-10-18 21:12:02 +02:00
parent f88c9cfdd3
commit c50a260263
35 changed files with 1854 additions and 59 deletions

View File

@@ -71,6 +71,11 @@
"description": "Error when location permission is permanently denied"
},
"locationPermissionRequired": "Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.",
"@locationPermissionRequired": {
"description": "Message when location permission is needed"
},
"locationServicesDisabled": "Location services are disabled. Please enable them in Settings.",
"@locationServicesDisabled": {
"description": "Error when location services are disabled"
@@ -1197,7 +1202,12 @@
"rooms": "Rooms",
"@rooms": {
"description": "Section header for rooms/channels"
"description": "Section header for rooms"
},
"channels": "Channels",
"@channels": {
"description": "Section header for broadcast channels"
},
"cacheStatistics": "Cache Statistics",

View File

@@ -29,6 +29,8 @@
"locationPermissionPermanentlyDenied": "Dopuštenje za lokaciju trajno odbijeno. Molimo omogućite u Postavkama.",
"locationPermissionRequired": "Dopuštenje za lokaciju potrebno je za GPS praćenje i koordinaciju tima. Možete ga omogućiti kasnije u Postavkama.",
"locationServicesDisabled": "Usluge lokacije su onemogućene. Molimo omogućite ih u Postavkama.",
"failedToGetGpsLocation": "Neuspjelo dobivanje GPS lokacije",
@@ -137,7 +139,7 @@
"sampleDataDescription": "Učitajte ili očistite primjere kontakata, poruka kanala i SAR markera za testiranje",
"loadSampleData": "Učitaj primjer podataka",
"loadSampleData": "Učitaj primjer",
"clearAllData": "Očisti sve podatke",
@@ -405,6 +407,8 @@
"rooms": "Sobe",
"channels": "Kanali",
"cacheStatistics": "Statistika predmemorije",
"totalTiles": "Ukupno pločica",

View File

@@ -184,6 +184,12 @@ abstract class AppLocalizations {
/// **'Location permission permanently denied. Please enable in Settings.'**
String get locationPermissionPermanentlyDenied;
/// Message when location permission is needed
///
/// In en, this message translates to:
/// **'Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.'**
String get locationPermissionRequired;
/// Error when location services are disabled
///
/// In en, this message translates to:
@@ -1311,12 +1317,18 @@ abstract class AppLocalizations {
/// **'Repeaters'**
String get repeaters;
/// Section header for rooms/channels
/// Section header for rooms
///
/// In en, this message translates to:
/// **'Rooms'**
String get rooms;
/// Section header for broadcast channels
///
/// In en, this message translates to:
/// **'Channels'**
String get channels;
/// Title for cache statistics section
///
/// In en, this message translates to:

View File

@@ -51,6 +51,10 @@ class AppLocalizationsEn extends AppLocalizations {
String get locationPermissionPermanentlyDenied =>
'Location permission permanently denied. Please enable in Settings.';
@override
String get locationPermissionRequired =>
'Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.';
@override
String get locationServicesDisabled =>
'Location services are disabled. Please enable them in Settings.';
@@ -701,6 +705,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get rooms => 'Rooms';
@override
String get channels => 'Channels';
@override
String get cacheStatistics => 'Cache Statistics';

View File

@@ -51,6 +51,10 @@ class AppLocalizationsHr extends AppLocalizations {
String get locationPermissionPermanentlyDenied =>
'Dopuštenje za lokaciju trajno odbijeno. Molimo omogućite u Postavkama.';
@override
String get locationPermissionRequired =>
'Dopuštenje za lokaciju potrebno je za GPS praćenje i koordinaciju tima. Možete ga omogućiti kasnije u Postavkama.';
@override
String get locationServicesDisabled =>
'Usluge lokacije su onemogućene. Molimo omogućite ih u Postavkama.';
@@ -233,7 +237,7 @@ class AppLocalizationsHr extends AppLocalizations {
'Učitajte ili očistite primjere kontakata, poruka kanala i SAR markera za testiranje';
@override
String get loadSampleData => 'Učitaj primjer podataka';
String get loadSampleData => 'Učitaj primjer';
@override
String get clearAllData => 'Očisti sve podatke';
@@ -701,6 +705,9 @@ class AppLocalizationsHr extends AppLocalizations {
@override
String get rooms => 'Sobe';
@override
String get channels => 'Kanali';
@override
String get cacheStatistics => 'Statistika predmemorije';

View File

@@ -51,6 +51,10 @@ class AppLocalizationsSl extends AppLocalizations {
String get locationPermissionPermanentlyDenied =>
'Dovoljenje za lokacijo trajno zavrnjeno. Prosimo, omogočite v Nastavitvah.';
@override
String get locationPermissionRequired =>
'Dovoljenje za lokacijo je potrebno za GPS sledenje in usklajevanje ekipe. Lahko ga omogočite kasneje v Nastavitvah.';
@override
String get locationServicesDisabled =>
'Lokacijske storitve so onemogočene. Prosimo, omogočite jih v Nastavitvah.';
@@ -233,7 +237,7 @@ class AppLocalizationsSl extends AppLocalizations {
'Naložite ali počistite vzorčne stike, sporočila kanalov in SAR označevalce za testiranje';
@override
String get loadSampleData => 'Naloži vzorčne podatke';
String get loadSampleData => 'Naloži vzorec';
@override
String get clearAllData => 'Počisti vse podatke';
@@ -701,6 +705,9 @@ class AppLocalizationsSl extends AppLocalizations {
@override
String get rooms => 'Sobe';
@override
String get channels => 'Kanali';
@override
String get cacheStatistics => 'Statistika predpomnilnika';

View File

@@ -29,6 +29,8 @@
"locationPermissionPermanentlyDenied": "Dovoljenje za lokacijo trajno zavrnjeno. Prosimo, omogočite v Nastavitvah.",
"locationPermissionRequired": "Dovoljenje za lokacijo je potrebno za GPS sledenje in usklajevanje ekipe. Lahko ga omogočite kasneje v Nastavitvah.",
"locationServicesDisabled": "Lokacijske storitve so onemogočene. Prosimo, omogočite jih v Nastavitvah.",
"failedToGetGpsLocation": "Pridobitev GPS lokacije ni uspela",
@@ -137,7 +139,7 @@
"sampleDataDescription": "Naložite ali počistite vzorčne stike, sporočila kanalov in SAR označevalce za testiranje",
"loadSampleData": "Naloži vzorčne podatke",
"loadSampleData": "Naloži vzorec",
"clearAllData": "Počisti vse podatke",
@@ -405,6 +407,8 @@
"rooms": "Sobe",
"channels": "Kanali",
"cacheStatistics": "Statistika predpomnilnika",
"totalTiles": "Skupaj ploščic",