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 9fdf51f..890b992 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/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 75819a0..932e29c 100644 --- a/lib/screens/scanner_screen.dart +++ b/lib/screens/scanner_screen.dart @@ -1,3 +1,6 @@ +import 'dart:async'; +import 'dart:io' show Platform; + import 'package:flutter/material.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:provider/provider.dart'; @@ -18,6 +21,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 +44,25 @@ class _ScannerScreenState extends State { }; connector.addListener(_connectionListener); + + _bluetoothStateSubscription = FlutterBluePlus.adapterState.listen((state) { + if (mounted) { + setState(() { + _bluetoothState = state; + }); + // Cancel scan if Bluetooth turns off while scanning + if (state != BluetoothAdapterState.on) { + unawaited(connector.stopScan()); + } + } + }); } @override void dispose() { final connector = Provider.of(context, listen: false); connector.removeListener(_connectionListener); + unawaited(_bluetoothStateSubscription.cancel()); super.dispose(); } @@ -62,6 +80,10 @@ class _ScannerScreenState extends State { builder: (context, connector, child) { return Column( children: [ + // Bluetooth off warning + if (_bluetoothState == BluetoothAdapterState.off) + _bluetoothOffWarning(context), + // Status bar _buildStatusBar(context, connector), @@ -76,15 +98,18 @@ class _ScannerScreenState extends State { builder: (context, connector, child) { final isScanning = connector.state == MeshCoreConnectionState.scanning; + final isBluetoothOff = _bluetoothState == BluetoothAdapterState.off; return FloatingActionButton.extended( - onPressed: () { - if (isScanning) { - connector.stopScan(); - } else { - connector.startScan(); - } - }, + onPressed: isBluetoothOff + ? null + : () { + if (isScanning) { + connector.stopScan(); + } else { + connector.startScan(); + } + }, icon: isScanning ? const SizedBox( width: 20, @@ -205,4 +230,47 @@ 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: errorColor.withValues(alpha: 0.15), + child: Row( + children: [ + Icon(Icons.bluetooth_disabled, size: 24, color: errorColor), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + context.l10n.scanner_bluetoothOff, + style: TextStyle( + color: errorColor, + fontWeight: FontWeight.w600, + fontSize: 14, + ), + ), + const SizedBox(height: 4), + Text( + context.l10n.scanner_bluetoothOffMessage, + style: TextStyle( + color: errorColor.withValues(alpha: 0.85), + fontSize: 12, + ), + ), + ], + ), + ), + if (Platform.isAndroid) + 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: