From 9ce00556ec7a3b8a652161514c9f656c6f801913 Mon Sep 17 00:00:00 2001 From: Leah Date: Wed, 11 Feb 2026 22:40:42 +0100 Subject: [PATCH 1/7] Add warning when bluetooth is off --- lib/l10n/app_en.arb | 3 ++ lib/screens/scanner_screen.dart | 55 +++++++++++++++++++++ untranslated.json | 86 ++++++++++++++++++++++++++++++++- 3 files changed, 143 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 0c54be3..dcbc7cb 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -66,6 +66,9 @@ }, "scanner_stop": "Stop", "scanner_scan": "Scan", + "scanner_bluetoothOff": "Bluetooth is off", + "scanner_bluetoothOffMessage": "Please turn on Bluetooth to scan for devices", + "scanner_enableBluetooth": "Enable Bluetooth", "device_quickSwitch": "Quick switch", "device_meshcore": "MeshCore", diff --git a/lib/screens/scanner_screen.dart b/lib/screens/scanner_screen.dart index 75819a0..2049dab 100644 --- a/lib/screens/scanner_screen.dart +++ b/lib/screens/scanner_screen.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:provider/provider.dart'; @@ -18,6 +20,8 @@ class ScannerScreen extends StatefulWidget { class _ScannerScreenState extends State { bool _changedNavigation = false; late final VoidCallback _connectionListener; + BluetoothAdapterState _bluetoothState = BluetoothAdapterState.unknown; + late StreamSubscription _bluetoothStateSubscription; @override void initState() { @@ -39,12 +43,22 @@ class _ScannerScreenState extends State { }; connector.addListener(_connectionListener); + + _bluetoothStateSubscription = + FlutterBluePlus.adapterState.listen((state) { + if (mounted) { + setState(() { + _bluetoothState = state; + }); + } + }); } @override void dispose() { final connector = Provider.of(context, listen: false); connector.removeListener(_connectionListener); + _bluetoothStateSubscription.cancel(); super.dispose(); } @@ -62,6 +76,10 @@ class _ScannerScreenState extends State { builder: (context, connector, child) { return Column( children: [ + // Bluetooth off warning + if (_bluetoothState != BluetoothAdapterState.on) + _bluetoothOffWarning(context), + // Status bar _buildStatusBar(context, connector), @@ -205,4 +223,41 @@ class _ScannerScreenState extends State { } } } + + Widget _bluetoothOffWarning(BuildContext context) { + return Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + color: Colors.red.withValues(alpha: 0.15), + child: Row( + children: [ + Icon(Icons.bluetooth_disabled, size: 24, color: Colors.red), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + context.l10n.scanner_bluetoothOff, + style: const TextStyle( + color: Colors.red, + fontWeight: FontWeight.w600, + fontSize: 14, + ), + ), + const SizedBox(height: 4), + Text( + context.l10n.scanner_bluetoothOffMessage, + style: TextStyle( + color: Colors.red.withValues(alpha: 0.85), + fontSize: 12, + ), + ), + ], + ), + ), + ], + ), + ); + } } diff --git a/untranslated.json b/untranslated.json index 9e26dfe..2b5dc43 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1 +1,85 @@ -{} \ No newline at end of file +{ + "bg": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "de": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "es": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "fr": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "it": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "nl": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "pl": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "pt": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "ru": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "sk": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "sl": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "sv": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "uk": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ], + + "zh": [ + "scanner_bluetoothOff", + "scanner_bluetoothOffMessage", + "scanner_enableBluetooth" + ] +} From 9332d8126f34abb128ea4059864ab33e5f23b475 Mon Sep 17 00:00:00 2001 From: Leah Date: Wed, 11 Feb 2026 22:58:15 +0100 Subject: [PATCH 2/7] linted and added greying out --- lib/screens/scanner_screen.dart | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/lib/screens/scanner_screen.dart b/lib/screens/scanner_screen.dart index 2049dab..e52afb3 100644 --- a/lib/screens/scanner_screen.dart +++ b/lib/screens/scanner_screen.dart @@ -44,12 +44,16 @@ class _ScannerScreenState extends State { connector.addListener(_connectionListener); - _bluetoothStateSubscription = - FlutterBluePlus.adapterState.listen((state) { + _bluetoothStateSubscription = FlutterBluePlus.adapterState.listen((state) { if (mounted) { setState(() { _bluetoothState = state; }); + // Cancel scan if Bluetooth turns off while scanning + if (state != BluetoothAdapterState.on && + connector.state == MeshCoreConnectionState.scanning) { + connector.stopScan(); + } } }); } @@ -94,15 +98,23 @@ class _ScannerScreenState extends State { builder: (context, connector, child) { final isScanning = connector.state == MeshCoreConnectionState.scanning; + final isBluetoothOn = _bluetoothState == BluetoothAdapterState.on; return FloatingActionButton.extended( - onPressed: () { - if (isScanning) { - connector.stopScan(); - } else { - connector.startScan(); - } - }, + onPressed: isBluetoothOn + ? () { + if (isScanning) { + connector.stopScan(); + } else { + connector.startScan(); + } + } + : null, + backgroundColor: isBluetoothOn ? null : Colors.grey, + foregroundColor: isBluetoothOn ? null : Colors.white, + mouseCursor: isBluetoothOn + ? SystemMouseCursors.click + : SystemMouseCursors.forbidden, icon: isScanning ? const SizedBox( width: 20, From bc77f7e28753f5a0490245902853e6d891cb34df Mon Sep 17 00:00:00 2001 From: Leah <45321184+ChaoticLeah@users.noreply.github.com> Date: Wed, 11 Feb 2026 23:03:41 +0100 Subject: [PATCH 3/7] Remove unused translation Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- lib/l10n/app_en.arb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index dcbc7cb..668f72e 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -68,7 +68,6 @@ "scanner_scan": "Scan", "scanner_bluetoothOff": "Bluetooth is off", "scanner_bluetoothOffMessage": "Please turn on Bluetooth to scan for devices", - "scanner_enableBluetooth": "Enable Bluetooth", "device_quickSwitch": "Quick switch", "device_meshcore": "MeshCore", From c05f813d653d0500a936d3dd50768bc6eb3582de Mon Sep 17 00:00:00 2001 From: Leah <45321184+ChaoticLeah@users.noreply.github.com> Date: Thu, 12 Feb 2026 20:02:56 +0100 Subject: [PATCH 4/7] Update lib/screens/scanner_screen.dart Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- lib/screens/scanner_screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/screens/scanner_screen.dart b/lib/screens/scanner_screen.dart index e52afb3..1aeba47 100644 --- a/lib/screens/scanner_screen.dart +++ b/lib/screens/scanner_screen.dart @@ -243,7 +243,7 @@ class _ScannerScreenState extends State { color: Colors.red.withValues(alpha: 0.15), child: Row( children: [ - Icon(Icons.bluetooth_disabled, size: 24, color: Colors.red), + const Icon(Icons.bluetooth_disabled, size: 24, color: Colors.red), const SizedBox(width: 12), Expanded( child: Column( From 01c83909897c8969c5b982548a3c7f401b5c3e4e Mon Sep 17 00:00:00 2001 From: Leah Date: Thu, 12 Feb 2026 20:14:56 +0100 Subject: [PATCH 5/7] make stuff unawaited + maybe fix edge case? --- lib/screens/scanner_screen.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/screens/scanner_screen.dart b/lib/screens/scanner_screen.dart index e52afb3..ef7f90f 100644 --- a/lib/screens/scanner_screen.dart +++ b/lib/screens/scanner_screen.dart @@ -50,9 +50,8 @@ class _ScannerScreenState extends State { _bluetoothState = state; }); // Cancel scan if Bluetooth turns off while scanning - if (state != BluetoothAdapterState.on && - connector.state == MeshCoreConnectionState.scanning) { - connector.stopScan(); + if (state != BluetoothAdapterState.on) { + unawaited(connector.stopScan()); } } }); @@ -62,7 +61,7 @@ class _ScannerScreenState extends State { void dispose() { final connector = Provider.of(context, listen: false); connector.removeListener(_connectionListener); - _bluetoothStateSubscription.cancel(); + unawaited(_bluetoothStateSubscription.cancel()); super.dispose(); } From 37db955ab2d344bf1cbfd5fb1f0e561038eca0c4 Mon Sep 17 00:00:00 2001 From: zjs81 Date: Sat, 14 Feb 2026 01:46:40 -0700 Subject: [PATCH 6/7] Fixed banner flash, added enable bluetooth button fixed theme to use app theme colors removed FAB overrides because material 3 does this for us, fixed missing translations. --- lib/l10n/app_bg.arb | 5 +- lib/l10n/app_de.arb | 5 +- lib/l10n/app_en.arb | 1 + lib/l10n/app_es.arb | 5 +- lib/l10n/app_fr.arb | 5 +- lib/l10n/app_it.arb | 5 +- lib/l10n/app_localizations.dart | 18 +++++++ lib/l10n/app_localizations_bg.dart | 10 ++++ lib/l10n/app_localizations_de.dart | 10 ++++ lib/l10n/app_localizations_en.dart | 10 ++++ lib/l10n/app_localizations_es.dart | 10 ++++ lib/l10n/app_localizations_fr.dart | 10 ++++ lib/l10n/app_localizations_it.dart | 10 ++++ lib/l10n/app_localizations_nl.dart | 10 ++++ lib/l10n/app_localizations_pl.dart | 10 ++++ lib/l10n/app_localizations_pt.dart | 10 ++++ lib/l10n/app_localizations_ru.dart | 10 ++++ lib/l10n/app_localizations_sk.dart | 10 ++++ lib/l10n/app_localizations_sl.dart | 10 ++++ lib/l10n/app_localizations_sv.dart | 10 ++++ lib/l10n/app_localizations_uk.dart | 10 ++++ lib/l10n/app_localizations_zh.dart | 9 ++++ lib/l10n/app_nl.arb | 5 +- lib/l10n/app_pl.arb | 5 +- lib/l10n/app_pt.arb | 5 +- lib/l10n/app_ru.arb | 5 +- lib/l10n/app_sk.arb | 5 +- lib/l10n/app_sl.arb | 5 +- lib/l10n/app_sv.arb | 5 +- lib/l10n/app_uk.arb | 5 +- lib/l10n/app_zh.arb | 5 +- lib/screens/scanner_screen.dart | 32 +++++------ pubspec.lock | 20 +++---- untranslated.json | 86 +----------------------------- 34 files changed, 251 insertions(+), 125 deletions(-) diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index 54d792e..a1cfb3e 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -1595,5 +1595,8 @@ "pathTrace_clearTooltip": "Изчисти пътя", "map_removeLast": "Премахни Последно", "map_runTrace": "Изпълни Път на Следване", - "map_tapToAdd": "Натиснете върху възлите, за да ги добавите към пътя." + "map_tapToAdd": "Натиснете върху възлите, за да ги добавите към пътя.", + "scanner_bluetoothOff": "Bluetooth е изключен.", + "scanner_enableBluetooth": "Активирайте Bluetooth", + "scanner_bluetoothOffMessage": "Моля, активирайте Bluetooth, за да сканирате за устройства." } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 2cece8a..2e66222 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1623,5 +1623,8 @@ "map_tapToAdd": "Tippen Sie auf Knoten, um sie zum Pfad hinzuzufügen.", "map_runTrace": "Pfadverlauf ausführen", "pathTrace_clearTooltip": "Pfad löschen", - "map_pathTraceCancelled": "Pfadverfolgung abgebrochen." + "map_pathTraceCancelled": "Pfadverfolgung abgebrochen.", + "scanner_bluetoothOffMessage": "Bitte aktivieren Sie Bluetooth, um nach Geräten zu suchen.", + "scanner_bluetoothOff": "Bluetooth ist deaktiviert.", + "scanner_enableBluetooth": "Bluetooth aktivieren" } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 9f24f46..890b992 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -68,6 +68,7 @@ "scanner_scan": "Scan", "scanner_bluetoothOff": "Bluetooth is off", "scanner_bluetoothOffMessage": "Please turn on Bluetooth to scan for devices", + "scanner_enableBluetooth": "Enable Bluetooth", "device_quickSwitch": "Quick switch", "device_meshcore": "MeshCore", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index f1a0651..e6b22fa 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1623,5 +1623,8 @@ "map_runTrace": "Ejecutar Rastreo de Ruta", "map_tapToAdd": "Pulse en los nodos para agregarlos al camino.", "map_removeLast": "Eliminar último", - "map_pathTraceCancelled": "Rastreo de ruta cancelado." + "map_pathTraceCancelled": "Rastreo de ruta cancelado.", + "scanner_bluetoothOffMessage": "Por favor, active el Bluetooth para escanear dispositivos.", + "scanner_bluetoothOff": "Bluetooth está desactivado.", + "scanner_enableBluetooth": "Habilitar Bluetooth" } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 39d7176..f11238b 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1595,5 +1595,8 @@ "pathTrace_clearTooltip": "Effacer le chemin", "map_pathTraceCancelled": "Traçage de chemin annulé", "map_removeLast": "Supprimer le dernier", - "map_runTrace": "Exécuter la traçage de chemin" + "map_runTrace": "Exécuter la traçage de chemin", + "scanner_bluetoothOffMessage": "Veuillez activer le Bluetooth pour rechercher des appareils.", + "scanner_bluetoothOff": "Le Bluetooth est désactivé.", + "scanner_enableBluetooth": "Activer le Bluetooth" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 99f11f2..601f1af 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1595,5 +1595,8 @@ "map_pathTraceCancelled": "Tracciamento del percorso annullato.", "pathTrace_clearTooltip": "Pulisci percorso", "map_runTrace": "Esegui Path Trace", - "map_tapToAdd": "Tocca i nodi per aggiungerli al percorso." + "map_tapToAdd": "Tocca i nodi per aggiungerli al percorso.", + "scanner_bluetoothOff": "Il Bluetooth è disattivato.", + "scanner_bluetoothOffMessage": "Si prega di attivare il Bluetooth per effettuare la scansione dei dispositivi.", + "scanner_enableBluetooth": "Abilita il Bluetooth" } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 20ac664..bc1cfbd 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -376,6 +376,24 @@ abstract class AppLocalizations { /// **'Scan'** String get scanner_scan; + /// No description provided for @scanner_bluetoothOff. + /// + /// In en, this message translates to: + /// **'Bluetooth is off'** + String get scanner_bluetoothOff; + + /// No description provided for @scanner_bluetoothOffMessage. + /// + /// In en, this message translates to: + /// **'Please turn on Bluetooth to scan for devices'** + String get scanner_bluetoothOffMessage; + + /// No description provided for @scanner_enableBluetooth. + /// + /// In en, this message translates to: + /// **'Enable Bluetooth'** + String get scanner_enableBluetooth; + /// No description provided for @device_quickSwitch. /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index 30a7ca7..695bde2 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -143,6 +143,16 @@ class AppLocalizationsBg extends AppLocalizations { @override String get scanner_scan => 'Сканирай'; + @override + String get scanner_bluetoothOff => 'Bluetooth е изключен.'; + + @override + String get scanner_bluetoothOffMessage => + 'Моля, активирайте Bluetooth, за да сканирате за устройства.'; + + @override + String get scanner_enableBluetooth => 'Активирайте Bluetooth'; + @override String get device_quickSwitch => 'Бързо превключване'; diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 4c3245d..6e04655 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -143,6 +143,16 @@ class AppLocalizationsDe extends AppLocalizations { @override String get scanner_scan => 'Scannen'; + @override + String get scanner_bluetoothOff => 'Bluetooth ist deaktiviert.'; + + @override + String get scanner_bluetoothOffMessage => + 'Bitte aktivieren Sie Bluetooth, um nach Geräten zu suchen.'; + + @override + String get scanner_enableBluetooth => 'Bluetooth aktivieren'; + @override String get device_quickSwitch => 'Schnelles Umschalten'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 120d242..5ed8162 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -142,6 +142,16 @@ class AppLocalizationsEn extends AppLocalizations { @override String get scanner_scan => 'Scan'; + @override + String get scanner_bluetoothOff => 'Bluetooth is off'; + + @override + String get scanner_bluetoothOffMessage => + 'Please turn on Bluetooth to scan for devices'; + + @override + String get scanner_enableBluetooth => 'Enable Bluetooth'; + @override String get device_quickSwitch => 'Quick switch'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 069e3c7..ff4e8f3 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -143,6 +143,16 @@ class AppLocalizationsEs extends AppLocalizations { @override String get scanner_scan => 'Escanea'; + @override + String get scanner_bluetoothOff => 'Bluetooth está desactivado.'; + + @override + String get scanner_bluetoothOffMessage => + 'Por favor, active el Bluetooth para escanear dispositivos.'; + + @override + String get scanner_enableBluetooth => 'Habilitar Bluetooth'; + @override String get device_quickSwitch => 'Cambiar rápidamente'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 44b70af..f8b7775 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -143,6 +143,16 @@ class AppLocalizationsFr extends AppLocalizations { @override String get scanner_scan => 'Scanner'; + @override + String get scanner_bluetoothOff => 'Le Bluetooth est désactivé.'; + + @override + String get scanner_bluetoothOffMessage => + 'Veuillez activer le Bluetooth pour rechercher des appareils.'; + + @override + String get scanner_enableBluetooth => 'Activer le Bluetooth'; + @override String get device_quickSwitch => 'Basculement rapide'; diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index 0bce5b4..d8fd612 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -143,6 +143,16 @@ class AppLocalizationsIt extends AppLocalizations { @override String get scanner_scan => 'Scansiona'; + @override + String get scanner_bluetoothOff => 'Il Bluetooth è disattivato.'; + + @override + String get scanner_bluetoothOffMessage => + 'Si prega di attivare il Bluetooth per effettuare la scansione dei dispositivi.'; + + @override + String get scanner_enableBluetooth => 'Abilita il Bluetooth'; + @override String get device_quickSwitch => 'Passa velocemente'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 432de6c..de6c909 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -142,6 +142,16 @@ class AppLocalizationsNl extends AppLocalizations { @override String get scanner_scan => 'Scan'; + @override + String get scanner_bluetoothOff => 'Bluetooth is uitgeschakeld'; + + @override + String get scanner_bluetoothOffMessage => + 'Zorg ervoor dat Bluetooth is ingeschakeld om naar apparaten te zoeken.'; + + @override + String get scanner_enableBluetooth => 'Activeer Bluetooth'; + @override String get device_quickSwitch => 'Snelle overschakeling'; diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index fb53893..c5d2bd9 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -143,6 +143,16 @@ class AppLocalizationsPl extends AppLocalizations { @override String get scanner_scan => 'Przeskanuj'; + @override + String get scanner_bluetoothOff => 'Bluetooth jest wyłączony'; + + @override + String get scanner_bluetoothOffMessage => + 'Prosimy włączyć Bluetooth, aby przeskanować urządzenia.'; + + @override + String get scanner_enableBluetooth => 'Włącz Bluetooth'; + @override String get device_quickSwitch => 'Szybka zmiana'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index f9d8415..b5ffdd6 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -143,6 +143,16 @@ class AppLocalizationsPt extends AppLocalizations { @override String get scanner_scan => 'Digitalizar'; + @override + String get scanner_bluetoothOff => 'Bluetooth está desativado'; + + @override + String get scanner_bluetoothOffMessage => + 'Por favor, ative o Bluetooth para escanear por dispositivos.'; + + @override + String get scanner_enableBluetooth => 'Ative o Bluetooth'; + @override String get device_quickSwitch => 'Mudar rapidamente'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index f8a90ad..c41bf20 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -142,6 +142,16 @@ class AppLocalizationsRu extends AppLocalizations { @override String get scanner_scan => 'Сканирование'; + @override + String get scanner_bluetoothOff => 'Bluetooth выключен'; + + @override + String get scanner_bluetoothOffMessage => + 'Пожалуйста, включите Bluetooth, чтобы найти устройства.'; + + @override + String get scanner_enableBluetooth => 'Включите Bluetooth'; + @override String get device_quickSwitch => 'Быстрое переключение'; diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index 7e61cc2..e0ee455 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -143,6 +143,16 @@ class AppLocalizationsSk extends AppLocalizations { @override String get scanner_scan => 'Skončiť'; + @override + String get scanner_bluetoothOff => 'Bluetooth je vypnutý'; + + @override + String get scanner_bluetoothOffMessage => + 'Prosím, zapnite Bluetooth, aby ste mohli skenovať pre zariadenia.'; + + @override + String get scanner_enableBluetooth => 'Povolte Bluetooth'; + @override String get device_quickSwitch => 'Rýchle prepínač'; diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index 53da59a..36445f7 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -143,6 +143,16 @@ class AppLocalizationsSl extends AppLocalizations { @override String get scanner_scan => 'Skeniraj'; + @override + String get scanner_bluetoothOff => 'Bluetooth je izklopljen'; + + @override + String get scanner_bluetoothOffMessage => + 'Prosimo, vklopite Bluetooth, da lahko poiščete naprave.'; + + @override + String get scanner_enableBluetooth => 'Omogočite Bluetooth'; + @override String get device_quickSwitch => 'Hitro preklop'; diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index d125979..cbfa45d 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -142,6 +142,16 @@ class AppLocalizationsSv extends AppLocalizations { @override String get scanner_scan => 'Skanna'; + @override + String get scanner_bluetoothOff => 'Bluetooth är avstängt'; + + @override + String get scanner_bluetoothOffMessage => + 'Vänligen aktivera Bluetooth för att söka efter enheter.'; + + @override + String get scanner_enableBluetooth => 'Aktivera Bluetooth'; + @override String get device_quickSwitch => 'Snabb växling'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index de68840..4dfa260 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -143,6 +143,16 @@ class AppLocalizationsUk extends AppLocalizations { @override String get scanner_scan => 'Сканувати'; + @override + String get scanner_bluetoothOff => 'Bluetooth вимкнено'; + + @override + String get scanner_bluetoothOffMessage => + 'Будь ласка, увімкніть Bluetooth, щоб сканувати пристрої.'; + + @override + String get scanner_enableBluetooth => 'Увімкніть Bluetooth'; + @override String get device_quickSwitch => 'Швидке перемикання'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 040d4ef..4441b22 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -142,6 +142,15 @@ class AppLocalizationsZh extends AppLocalizations { @override String get scanner_scan => '扫描'; + @override + String get scanner_bluetoothOff => '蓝牙已关闭'; + + @override + String get scanner_bluetoothOffMessage => '请打开蓝牙功能,以便搜索设备。'; + + @override + String get scanner_enableBluetooth => '启用蓝牙'; + @override String get device_quickSwitch => '快速切换'; diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 033b424..b150d62 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1595,5 +1595,8 @@ "pathTrace_clearTooltip": "Weg wissen", "map_pathTraceCancelled": "Pad traceren geannuleerd", "map_tapToAdd": "Tik op knooppunten om ze toe te voegen aan het pad", - "map_runTrace": "Padeshulp traceren" + "map_runTrace": "Padeshulp traceren", + "scanner_enableBluetooth": "Activeer Bluetooth", + "scanner_bluetoothOffMessage": "Zorg ervoor dat Bluetooth is ingeschakeld om naar apparaten te zoeken.", + "scanner_bluetoothOff": "Bluetooth is uitgeschakeld" } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index e0a08dd..d576fca 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -1595,5 +1595,8 @@ "map_runTrace": "Uruchom ślad ścieżki", "pathTrace_clearTooltip": "Wyczyść ścieżkę", "map_removeLast": "Usuń ostatni", - "map_tapToAdd": "Kliknij na węzły, aby dodać je do ścieżki." + "map_tapToAdd": "Kliknij na węzły, aby dodać je do ścieżki.", + "scanner_bluetoothOffMessage": "Prosimy włączyć Bluetooth, aby przeskanować urządzenia.", + "scanner_bluetoothOff": "Bluetooth jest wyłączony", + "scanner_enableBluetooth": "Włącz Bluetooth" } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 20eee88..53c43fe 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -1595,5 +1595,8 @@ "map_pathTraceCancelled": "Rastreamento de caminho cancelado.", "pathTrace_clearTooltip": "Limpar caminho", "map_removeLast": "Remover Último", - "map_tapToAdd": "Toque nos nós para adicioná-los ao caminho." + "map_tapToAdd": "Toque nos nós para adicioná-los ao caminho.", + "scanner_enableBluetooth": "Ative o Bluetooth", + "scanner_bluetoothOff": "Bluetooth está desativado", + "scanner_bluetoothOffMessage": "Por favor, ative o Bluetooth para escanear por dispositivos." } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 165ccbb..19b4990 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -835,5 +835,8 @@ "map_removeLast": "Удалить последний", "map_pathTraceCancelled": "Отмена трассировки пути", "pathTrace_clearTooltip": "Очистить путь", - "map_runTrace": "Запустить трассировку пути" + "map_runTrace": "Запустить трассировку пути", + "scanner_enableBluetooth": "Включите Bluetooth", + "scanner_bluetoothOff": "Bluetooth выключен", + "scanner_bluetoothOffMessage": "Пожалуйста, включите Bluetooth, чтобы найти устройства." } diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb index 08439da..3f61292 100644 --- a/lib/l10n/app_sk.arb +++ b/lib/l10n/app_sk.arb @@ -1595,5 +1595,8 @@ "map_tapToAdd": "Kliknite na uzly, aby ste ich pridali k ceste.", "map_removeLast": "Odstrániť posledný", "map_runTrace": "Spustiť trasovaním cesty", - "map_pathTraceCancelled": "Zrušenie stopáže cesty bolo zrušené." + "map_pathTraceCancelled": "Zrušenie stopáže cesty bolo zrušené.", + "scanner_bluetoothOffMessage": "Prosím, zapnite Bluetooth, aby ste mohli skenovať pre zariadenia.", + "scanner_bluetoothOff": "Bluetooth je vypnutý", + "scanner_enableBluetooth": "Povolte Bluetooth" } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index d321fd1..d94695e 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -1595,5 +1595,8 @@ "map_removeLast": "Odstrani Zadnji", "map_runTrace": "Zaženi sledenje poti", "pathTrace_clearTooltip": "Počisti pot", - "map_pathTraceCancelled": "Spremljanje poti je prekinjeno." + "map_pathTraceCancelled": "Spremljanje poti je prekinjeno.", + "scanner_enableBluetooth": "Omogočite Bluetooth", + "scanner_bluetoothOffMessage": "Prosimo, vklopite Bluetooth, da lahko poiščete naprave.", + "scanner_bluetoothOff": "Bluetooth je izklopljen" } diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index 4b01494..59b3fca 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -1595,5 +1595,8 @@ "map_pathTraceCancelled": "Sökvägsspårning avbruten.", "map_runTrace": "Kör spårsökning", "map_tapToAdd": "Tryck på noder för att lägga till dem i banan.", - "map_removeLast": "Ta bort sista" + "map_removeLast": "Ta bort sista", + "scanner_enableBluetooth": "Aktivera Bluetooth", + "scanner_bluetoothOffMessage": "Vänligen aktivera Bluetooth för att söka efter enheter.", + "scanner_bluetoothOff": "Bluetooth är avstängt" } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 9ff05fb..26f3984 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -1595,5 +1595,8 @@ "map_runTrace": "Виконати трасування шляху", "pathTrace_clearTooltip": "Очистити шлях", "map_removeLast": "Видалити останній", - "map_pathTraceCancelled": "Відмінується трасування шляху" + "map_pathTraceCancelled": "Відмінується трасування шляху", + "scanner_enableBluetooth": "Увімкніть Bluetooth", + "scanner_bluetoothOffMessage": "Будь ласка, увімкніть Bluetooth, щоб сканувати пристрої.", + "scanner_bluetoothOff": "Bluetooth вимкнено" } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 0f8c079..7b4b3ab 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1595,5 +1595,8 @@ "pathTrace_clearTooltip": "清除路径", "map_pathTraceCancelled": "路径跟踪已取消", "map_removeLast": "删除最后一个", - "map_runTrace": "运行路径跟踪" + "map_runTrace": "运行路径跟踪", + "scanner_bluetoothOffMessage": "请打开蓝牙功能,以便搜索设备。", + "scanner_bluetoothOff": "蓝牙已关闭", + "scanner_enableBluetooth": "启用蓝牙" } diff --git a/lib/screens/scanner_screen.dart b/lib/screens/scanner_screen.dart index 7428145..70f00a0 100644 --- a/lib/screens/scanner_screen.dart +++ b/lib/screens/scanner_screen.dart @@ -80,7 +80,7 @@ class _ScannerScreenState extends State { return Column( children: [ // Bluetooth off warning - if (_bluetoothState != BluetoothAdapterState.on) + if (_bluetoothState == BluetoothAdapterState.off) _bluetoothOffWarning(context), // Status bar @@ -97,23 +97,18 @@ class _ScannerScreenState extends State { builder: (context, connector, child) { final isScanning = connector.state == MeshCoreConnectionState.scanning; - final isBluetoothOn = _bluetoothState == BluetoothAdapterState.on; + final isBluetoothOff = _bluetoothState == BluetoothAdapterState.off; return FloatingActionButton.extended( - onPressed: isBluetoothOn - ? () { + onPressed: isBluetoothOff + ? null + : () { if (isScanning) { connector.stopScan(); } else { connector.startScan(); } - } - : null, - backgroundColor: isBluetoothOn ? null : Colors.grey, - foregroundColor: isBluetoothOn ? null : Colors.white, - mouseCursor: isBluetoothOn - ? SystemMouseCursors.click - : SystemMouseCursors.forbidden, + }, icon: isScanning ? const SizedBox( width: 20, @@ -236,13 +231,14 @@ class _ScannerScreenState extends State { } Widget _bluetoothOffWarning(BuildContext context) { + final errorColor = Theme.of(context).colorScheme.error; return Container( width: double.infinity, padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), - color: Colors.red.withValues(alpha: 0.15), + color: errorColor.withValues(alpha: 0.15), child: Row( children: [ - const Icon(Icons.bluetooth_disabled, size: 24, color: Colors.red), + Icon(Icons.bluetooth_disabled, size: 24, color: errorColor), const SizedBox(width: 12), Expanded( child: Column( @@ -250,8 +246,8 @@ class _ScannerScreenState extends State { children: [ Text( context.l10n.scanner_bluetoothOff, - style: const TextStyle( - color: Colors.red, + style: TextStyle( + color: errorColor, fontWeight: FontWeight.w600, fontSize: 14, ), @@ -260,13 +256,17 @@ class _ScannerScreenState extends State { Text( context.l10n.scanner_bluetoothOffMessage, style: TextStyle( - color: Colors.red.withValues(alpha: 0.85), + color: errorColor.withValues(alpha: 0.85), fontSize: 12, ), ), ], ), ), + TextButton( + onPressed: () => FlutterBluePlus.turnOn(), + child: Text(context.l10n.scanner_enableBluetooth), + ), ], ), ); diff --git a/pubspec.lock b/pubspec.lock index 207ff51..fc11656 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -69,10 +69,10 @@ packages: dependency: "direct main" description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.0" checked_yaml: dependency: transitive description: @@ -489,26 +489,26 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.17.0" mgrs_dart: dependency: transitive description: @@ -910,10 +910,10 @@ packages: dependency: transitive description: name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.9" + version: "0.7.7" timezone: dependency: transitive description: diff --git a/untranslated.json b/untranslated.json index 2b5dc43..9e26dfe 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,85 +1 @@ -{ - "bg": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "de": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "es": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "fr": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "it": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "nl": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "pl": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "pt": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "ru": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "sk": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "sl": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "sv": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "uk": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ], - - "zh": [ - "scanner_bluetoothOff", - "scanner_bluetoothOffMessage", - "scanner_enableBluetooth" - ] -} +{} \ No newline at end of file From 9250dfec31ca68359642d740afc36251c6e62e59 Mon Sep 17 00:00:00 2001 From: zjs81 Date: Sat, 14 Feb 2026 01:54:30 -0700 Subject: [PATCH 7/7] Gate the turn on BLE button to android --- lib/screens/scanner_screen.dart | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/screens/scanner_screen.dart b/lib/screens/scanner_screen.dart index 70f00a0..932e29c 100644 --- a/lib/screens/scanner_screen.dart +++ b/lib/screens/scanner_screen.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io' show Platform; import 'package:flutter/material.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; @@ -263,10 +264,11 @@ class _ScannerScreenState extends State { ], ), ), - TextButton( - onPressed: () => FlutterBluePlus.turnOn(), - child: Text(context.l10n.scanner_enableBluetooth), - ), + if (Platform.isAndroid) + TextButton( + onPressed: () => FlutterBluePlus.turnOn(), + child: Text(context.l10n.scanner_enableBluetooth), + ), ], ), );