From 5676cbd84e9de4835efd53f0f4d6a7688ca299ed Mon Sep 17 00:00:00 2001 From: Ben Allfree Date: Sun, 22 Feb 2026 07:40:40 -0800 Subject: [PATCH] chrome required screen --- lib/l10n/app_bg.arb | 2 + lib/l10n/app_de.arb | 2 + lib/l10n/app_en.arb | 2 + lib/l10n/app_es.arb | 2 + lib/l10n/app_fr.arb | 2 + lib/l10n/app_it.arb | 2 + lib/l10n/app_localizations.dart | 12 ++++ lib/l10n/app_localizations_bg.dart | 7 ++ lib/l10n/app_localizations_de.dart | 7 ++ lib/l10n/app_localizations_en.dart | 7 ++ lib/l10n/app_localizations_es.dart | 7 ++ lib/l10n/app_localizations_fr.dart | 7 ++ lib/l10n/app_localizations_it.dart | 7 ++ lib/l10n/app_localizations_nl.dart | 7 ++ lib/l10n/app_localizations_pl.dart | 7 ++ lib/l10n/app_localizations_pt.dart | 7 ++ lib/l10n/app_localizations_ru.dart | 7 ++ lib/l10n/app_localizations_sk.dart | 7 ++ lib/l10n/app_localizations_sl.dart | 7 ++ lib/l10n/app_localizations_sv.dart | 7 ++ lib/l10n/app_localizations_uk.dart | 7 ++ lib/l10n/app_localizations_zh.dart | 7 ++ lib/l10n/app_nl.arb | 2 + lib/l10n/app_pl.arb | 2 + lib/l10n/app_pt.arb | 2 + lib/l10n/app_ru.arb | 2 + lib/l10n/app_sk.arb | 2 + lib/l10n/app_sl.arb | 2 + lib/l10n/app_sv.arb | 2 + lib/l10n/app_uk.arb | 2 + lib/l10n/app_zh.arb | 2 + lib/main.dart | 7 +- lib/screens/chrome_required_screen.dart | 91 +++++++++++++++++++++++++ lib/utils/browser_detection.dart | 2 + lib/utils/browser_detection_stub.dart | 3 + lib/utils/browser_detection_web.dart | 15 ++++ lib/utils/platform_info.dart | 4 ++ 37 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 lib/screens/chrome_required_screen.dart create mode 100644 lib/utils/browser_detection.dart create mode 100644 lib/utils/browser_detection_stub.dart create mode 100644 lib/utils/browser_detection_web.dart diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index 8609023..848b6de 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -1596,6 +1596,8 @@ "scanner_bluetoothOff": "Bluetooth е изключен.", "scanner_enableBluetooth": "Активирайте Bluetooth", "scanner_bluetoothOffMessage": "Моля, активирайте Bluetooth, за да сканирате за устройства.", + "scanner_chromeRequired": "Изисква се браузър Chrome", + "scanner_chromeRequiredMessage": "Това уеб приложение изисква Google Chrome или браузър, базиран на Chromium, за поддръжка на Bluetooth.", "snrIndicator_lastSeen": "Последно видян", "snrIndicator_nearByRepeaters": "Близки повтарящи се устройства", "chat_ShowAllPaths": "Покажи всички пътища", diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index e5c82f7..e645bdc 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1622,6 +1622,8 @@ "pathTrace_clearTooltip": "Pfad löschen", "map_pathTraceCancelled": "Pfadverfolgung abgebrochen.", "scanner_bluetoothOffMessage": "Bitte aktivieren Sie Bluetooth, um nach Geräten zu suchen.", + "scanner_chromeRequired": "Chrome Browser erforderlich", + "scanner_chromeRequiredMessage": "Diese Webanwendung erfordert Google Chrome oder einen Chromium-basierten Browser für die Bluetooth-Unterstützung.", "scanner_bluetoothOff": "Bluetooth ist deaktiviert.", "scanner_enableBluetooth": "Bluetooth aktivieren", "snrIndicator_lastSeen": "Zuletzt gesehen", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 67ca72e..7f1ecbd 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -72,6 +72,8 @@ "scanner_scan": "Scan", "scanner_bluetoothOff": "Bluetooth is off", "scanner_bluetoothOffMessage": "Please turn on Bluetooth to scan for devices", + "scanner_chromeRequired": "Chrome Browser Required", + "scanner_chromeRequiredMessage": "This web application requires Google Chrome or a Chromium-based browser for Bluetooth support.", "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 483b4d3..5e333e5 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1622,6 +1622,8 @@ "map_removeLast": "Eliminar último", "map_pathTraceCancelled": "Rastreo de ruta cancelado.", "scanner_bluetoothOffMessage": "Por favor, active el Bluetooth para escanear dispositivos.", + "scanner_chromeRequired": "Navegador Chrome requerido", + "scanner_chromeRequiredMessage": "Esta aplicación web requiere Google Chrome o un navegador basado en Chromium para el soporte de Bluetooth.", "scanner_bluetoothOff": "Bluetooth está desactivado.", "scanner_enableBluetooth": "Habilitar Bluetooth", "snrIndicator_nearByRepeaters": "Repetidores cercanos", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index e162cdb..a0ae3b8 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1594,6 +1594,8 @@ "map_removeLast": "Supprimer le dernier", "map_runTrace": "Exécuter la traçage de chemin", "scanner_bluetoothOffMessage": "Veuillez activer le Bluetooth pour rechercher des appareils.", + "scanner_chromeRequired": "Navigateur Chrome requis", + "scanner_chromeRequiredMessage": "Cette application web nécessite Google Chrome ou un navigateur basé sur Chromium pour le support Bluetooth.", "scanner_bluetoothOff": "Le Bluetooth est désactivé.", "scanner_enableBluetooth": "Activer le Bluetooth", "snrIndicator_lastSeen": "Dernière fois vu", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 2f8d186..93359ac 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1595,6 +1595,8 @@ "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_chromeRequired": "Browser Chrome richiesto", + "scanner_chromeRequiredMessage": "Questa applicazione web richiede Google Chrome o un browser basato su Chromium per il supporto Bluetooth.", "scanner_enableBluetooth": "Abilita il Bluetooth", "snrIndicator_nearByRepeaters": "Ripetitori vicini", "snrIndicator_lastSeen": "Ultimo accesso", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index e9686ce..76210fd 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -388,6 +388,18 @@ abstract class AppLocalizations { /// **'Please turn on Bluetooth to scan for devices'** String get scanner_bluetoothOffMessage; + /// No description provided for @scanner_chromeRequired. + /// + /// In en, this message translates to: + /// **'Chrome Browser Required'** + String get scanner_chromeRequired; + + /// No description provided for @scanner_chromeRequiredMessage. + /// + /// In en, this message translates to: + /// **'This web application requires Google Chrome or a Chromium-based browser for Bluetooth support.'** + String get scanner_chromeRequiredMessage; + /// No description provided for @scanner_enableBluetooth. /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index cf4bf7b..971d189 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -150,6 +150,13 @@ class AppLocalizationsBg extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Моля, активирайте Bluetooth, за да сканирате за устройства.'; + @override + String get scanner_chromeRequired => 'Изисква се браузър Chrome'; + + @override + String get scanner_chromeRequiredMessage => + 'Това уеб приложение изисква Google Chrome или браузър, базиран на Chromium, за поддръжка на Bluetooth.'; + @override String get scanner_enableBluetooth => 'Активирайте Bluetooth'; diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index c6a07a4..f5cb3d4 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -150,6 +150,13 @@ class AppLocalizationsDe extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Bitte aktivieren Sie Bluetooth, um nach Geräten zu suchen.'; + @override + String get scanner_chromeRequired => 'Chrome Browser erforderlich'; + + @override + String get scanner_chromeRequiredMessage => + 'Diese Webanwendung erfordert Google Chrome oder einen Chromium-basierten Browser für die Bluetooth-Unterstützung.'; + @override String get scanner_enableBluetooth => 'Bluetooth aktivieren'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 254b5f4..a858737 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -149,6 +149,13 @@ class AppLocalizationsEn extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Please turn on Bluetooth to scan for devices'; + @override + String get scanner_chromeRequired => 'Chrome Browser Required'; + + @override + String get scanner_chromeRequiredMessage => + 'This web application requires Google Chrome or a Chromium-based browser for Bluetooth support.'; + @override String get scanner_enableBluetooth => 'Enable Bluetooth'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index dcde365..1d0bb2d 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -150,6 +150,13 @@ class AppLocalizationsEs extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Por favor, active el Bluetooth para escanear dispositivos.'; + @override + String get scanner_chromeRequired => 'Navegador Chrome requerido'; + + @override + String get scanner_chromeRequiredMessage => + 'Esta aplicación web requiere Google Chrome o un navegador basado en Chromium para el soporte de Bluetooth.'; + @override String get scanner_enableBluetooth => 'Habilitar Bluetooth'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index d572b8f..8ad6c74 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -150,6 +150,13 @@ class AppLocalizationsFr extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Veuillez activer le Bluetooth pour rechercher des appareils.'; + @override + String get scanner_chromeRequired => 'Navigateur Chrome requis'; + + @override + String get scanner_chromeRequiredMessage => + 'Cette application web nécessite Google Chrome ou un navigateur basé sur Chromium pour le support Bluetooth.'; + @override String get scanner_enableBluetooth => 'Activer le Bluetooth'; diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index d8e27f8..29bb627 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -150,6 +150,13 @@ class AppLocalizationsIt extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Si prega di attivare il Bluetooth per effettuare la scansione dei dispositivi.'; + @override + String get scanner_chromeRequired => 'Browser Chrome richiesto'; + + @override + String get scanner_chromeRequiredMessage => + 'Questa applicazione web richiede Google Chrome o un browser basato su Chromium per il supporto Bluetooth.'; + @override String get scanner_enableBluetooth => 'Abilita il Bluetooth'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 0a50e8b..77cc083 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -149,6 +149,13 @@ class AppLocalizationsNl extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Zorg ervoor dat Bluetooth is ingeschakeld om naar apparaten te zoeken.'; + @override + String get scanner_chromeRequired => 'Chrome-browser vereist'; + + @override + String get scanner_chromeRequiredMessage => + 'Deze webapplicatie vereist Google Chrome of een op Chromium gebaseerde browser voor Bluetooth-ondersteuning.'; + @override String get scanner_enableBluetooth => 'Activeer Bluetooth'; diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index 31dd8b5..d9c0539 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -150,6 +150,13 @@ class AppLocalizationsPl extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Prosimy włączyć Bluetooth, aby przeskanować urządzenia.'; + @override + String get scanner_chromeRequired => 'Wymagana przeglądarka Chrome'; + + @override + String get scanner_chromeRequiredMessage => + 'Ta aplikacja internetowa wymaga przeglądarki Google Chrome lub opartej na Chromium do obsługi Bluetooth.'; + @override String get scanner_enableBluetooth => 'Włącz Bluetooth'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 5092826..640988f 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -150,6 +150,13 @@ class AppLocalizationsPt extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Por favor, ative o Bluetooth para escanear por dispositivos.'; + @override + String get scanner_chromeRequired => 'Navegador Chrome necessário'; + + @override + String get scanner_chromeRequiredMessage => + 'Esta aplicação web requer o Google Chrome ou um navegador baseado no Chromium para suporte de Bluetooth.'; + @override String get scanner_enableBluetooth => 'Ative o Bluetooth'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 570b7c8..4de8db2 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -149,6 +149,13 @@ class AppLocalizationsRu extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Пожалуйста, включите Bluetooth, чтобы найти устройства.'; + @override + String get scanner_chromeRequired => 'Требуется браузер Chrome'; + + @override + String get scanner_chromeRequiredMessage => + 'Для поддержки Bluetooth в этом веб-приложении требуется Google Chrome или браузер на базе Chromium.'; + @override String get scanner_enableBluetooth => 'Включите Bluetooth'; diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index 8bbb6de..fe87700 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -150,6 +150,13 @@ class AppLocalizationsSk extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Prosím, zapnite Bluetooth, aby ste mohli skenovať pre zariadenia.'; + @override + String get scanner_chromeRequired => 'Vyžaduje sa prehliadač Chrome'; + + @override + String get scanner_chromeRequiredMessage => + 'Táto webová aplikácia vyžaduje Google Chrome alebo prehliadač založený na Chromium pre podporu Bluetooth.'; + @override String get scanner_enableBluetooth => 'Povolte Bluetooth'; diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index 61e3058..5d9901a 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -150,6 +150,13 @@ class AppLocalizationsSl extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Prosimo, vklopite Bluetooth, da lahko poiščete naprave.'; + @override + String get scanner_chromeRequired => 'Zahtevan brskalnik Chrome'; + + @override + String get scanner_chromeRequiredMessage => + 'Ta spletna aplikacija za podporo Bluetooth zahteva Google Chrome ali brskalnik na osnovi Chromiuma.'; + @override String get scanner_enableBluetooth => 'Omogočite Bluetooth'; diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index 79b30b8..c5a0ee9 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -149,6 +149,13 @@ class AppLocalizationsSv extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Vänligen aktivera Bluetooth för att söka efter enheter.'; + @override + String get scanner_chromeRequired => 'Chrome-webbläsare krävs'; + + @override + String get scanner_chromeRequiredMessage => + 'Denna webbapplikation kräver Google Chrome oder en Chromium-baserader webbläsare för Bluetooth-stöd.'; + @override String get scanner_enableBluetooth => 'Aktivera Bluetooth'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index f367002..35b5143 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -150,6 +150,13 @@ class AppLocalizationsUk extends AppLocalizations { String get scanner_bluetoothOffMessage => 'Будь ласка, увімкніть Bluetooth, щоб сканувати пристрої.'; + @override + String get scanner_chromeRequired => 'Потрібен браузер Chrome'; + + @override + String get scanner_chromeRequiredMessage => + 'Для підтримки Bluetooth у цьому веб-додатку потрібен Google Chrome або браузер на базі Chromium.'; + @override String get scanner_enableBluetooth => 'Увімкніть Bluetooth'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 7641800..a97e0fb 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -148,6 +148,13 @@ class AppLocalizationsZh extends AppLocalizations { @override String get scanner_bluetoothOffMessage => '请打开蓝牙功能,以便搜索设备。'; + @override + String get scanner_chromeRequired => '需要 Chrome 浏览器'; + + @override + String get scanner_chromeRequiredMessage => + '此 Web 应用程序需要 Google Chrome 或基于 Chromium 的浏览器以支持蓝牙。'; + @override String get scanner_enableBluetooth => '启用蓝牙'; diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 57b2fdd..5a5b0ab 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1595,6 +1595,8 @@ "map_runTrace": "Padeshulp traceren", "scanner_enableBluetooth": "Activeer Bluetooth", "scanner_bluetoothOffMessage": "Zorg ervoor dat Bluetooth is ingeschakeld om naar apparaten te zoeken.", + "scanner_chromeRequired": "Chrome-browser vereist", + "scanner_chromeRequiredMessage": "Deze webapplicatie vereist Google Chrome of een op Chromium gebaseerde browser voor Bluetooth-ondersteuning.", "scanner_bluetoothOff": "Bluetooth is uitgeschakeld", "snrIndicator_lastSeen": "Laatst gezien", "snrIndicator_nearByRepeaters": "Nabije herhalingseenheden", diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 3787fa7..72af443 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -1594,6 +1594,8 @@ "map_removeLast": "Usuń ostatni", "map_tapToAdd": "Kliknij na węzły, aby dodać je do ścieżki.", "scanner_bluetoothOffMessage": "Prosimy włączyć Bluetooth, aby przeskanować urządzenia.", + "scanner_chromeRequired": "Wymagana przeglądarka Chrome", + "scanner_chromeRequiredMessage": "Ta aplikacja internetowa wymaga przeglądarki Google Chrome lub opartej na Chromium do obsługi Bluetooth.", "scanner_bluetoothOff": "Bluetooth jest wyłączony", "scanner_enableBluetooth": "Włącz Bluetooth", "snrIndicator_lastSeen": "Ostatnio widziany", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 7be6694..35c4635 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -1596,6 +1596,8 @@ "scanner_enableBluetooth": "Ative o Bluetooth", "scanner_bluetoothOff": "Bluetooth está desativado", "scanner_bluetoothOffMessage": "Por favor, ative o Bluetooth para escanear por dispositivos.", + "scanner_chromeRequired": "Navegador Chrome necessário", + "scanner_chromeRequiredMessage": "Esta aplicação web requer o Google Chrome ou um navegador baseado no Chromium para suporte de Bluetooth.", "snrIndicator_nearByRepeaters": "Repetidores Próximos", "snrIndicator_lastSeen": "Visto pela última vez", "chat_ShowAllPaths": "Mostrar todos os caminhos", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 26cfce3..d4d1939 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -836,6 +836,8 @@ "scanner_enableBluetooth": "Включите Bluetooth", "scanner_bluetoothOff": "Bluetooth выключен", "scanner_bluetoothOffMessage": "Пожалуйста, включите Bluetooth, чтобы найти устройства.", + "scanner_chromeRequired": "Требуется браузер Chrome", + "scanner_chromeRequiredMessage": "Для поддержки Bluetooth в этом веб-приложении требуется Google Chrome или браузер на базе Chromium.", "snrIndicator_nearByRepeaters": "Ближайшие ретрансляторы", "snrIndicator_lastSeen": "Последний раз видели", "chat_ShowAllPaths": "Показать все пути", diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb index 8b2cb0a..8e8d1e8 100644 --- a/lib/l10n/app_sk.arb +++ b/lib/l10n/app_sk.arb @@ -1594,6 +1594,8 @@ "map_runTrace": "Spustiť trasovaním cesty", "map_pathTraceCancelled": "Zrušenie stopáže cesty bolo zrušené.", "scanner_bluetoothOffMessage": "Prosím, zapnite Bluetooth, aby ste mohli skenovať pre zariadenia.", + "scanner_chromeRequired": "Vyžaduje sa prehliadač Chrome", + "scanner_chromeRequiredMessage": "Táto webová aplikácia vyžaduje Google Chrome alebo prehliadač založený na Chromium pre podporu Bluetooth.", "scanner_bluetoothOff": "Bluetooth je vypnutý", "scanner_enableBluetooth": "Povolte Bluetooth", "snrIndicator_lastSeen": "Naposledy videný", diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index 4d3415d..2e749b9 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -1595,6 +1595,8 @@ "map_pathTraceCancelled": "Spremljanje poti je prekinjeno.", "scanner_enableBluetooth": "Omogočite Bluetooth", "scanner_bluetoothOffMessage": "Prosimo, vklopite Bluetooth, da lahko poiščete naprave.", + "scanner_chromeRequired": "Zahtevan brskalnik Chrome", + "scanner_chromeRequiredMessage": "Ta spletna aplikacija za podporo Bluetooth zahteva Google Chrome ali brskalnik na osnovi Chromiuma.", "scanner_bluetoothOff": "Bluetooth je izklopljen", "snrIndicator_lastSeen": "Zadnjič videno", "snrIndicator_nearByRepeaters": "Bližnji ponovitelji", diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index 8c5e399..b311a45 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -1595,6 +1595,8 @@ "map_removeLast": "Ta bort sista", "scanner_enableBluetooth": "Aktivera Bluetooth", "scanner_bluetoothOffMessage": "Vänligen aktivera Bluetooth för att söka efter enheter.", + "scanner_chromeRequired": "Chrome-webbläsare krävs", + "scanner_chromeRequiredMessage": "Denna webbapplikation kräver Google Chrome oder en Chromium-baserader webbläsare för Bluetooth-stöd.", "scanner_bluetoothOff": "Bluetooth är avstängt", "snrIndicator_lastSeen": "Senast sedd", "snrIndicator_nearByRepeaters": "Närliggande uppreparstationer", diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 910f8b0..f5d3a42 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -1595,6 +1595,8 @@ "map_pathTraceCancelled": "Відмінується трасування шляху", "scanner_enableBluetooth": "Увімкніть Bluetooth", "scanner_bluetoothOffMessage": "Будь ласка, увімкніть Bluetooth, щоб сканувати пристрої.", + "scanner_chromeRequired": "Потрібен браузер Chrome", + "scanner_chromeRequiredMessage": "Для підтримки Bluetooth у цьому веб-додатку потрібен Google Chrome або браузер на базі Chromium.", "scanner_bluetoothOff": "Bluetooth вимкнено", "snrIndicator_lastSeen": "Останній раз бачили", "snrIndicator_nearByRepeaters": "Ближні ретранслятори", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index d9efce7..1fac003 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1594,6 +1594,8 @@ "map_removeLast": "删除最后一个", "map_runTrace": "运行路径跟踪", "scanner_bluetoothOffMessage": "请打开蓝牙功能,以便搜索设备。", + "scanner_chromeRequired": "需要 Chrome 浏览器", + "scanner_chromeRequiredMessage": "此 Web 应用程序需要 Google Chrome 或基于 Chromium 的浏览器以支持蓝牙。", "scanner_bluetoothOff": "蓝牙已关闭", "scanner_enableBluetooth": "启用蓝牙", "snrIndicator_lastSeen": "最近访问", diff --git a/lib/main.dart b/lib/main.dart index 3650a7e..af065ef 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,9 @@ import 'package:flutter/foundation.dart'; import 'l10n/app_localizations.dart'; import 'package:provider/provider.dart'; +import 'screens/chrome_required_screen.dart'; +import 'utils/platform_info.dart'; + import 'connector/meshcore_connector.dart'; import 'screens/scanner_screen.dart'; import 'services/storage_service.dart'; @@ -179,7 +182,9 @@ class MeshCoreApp extends StatelessWidget { NotificationService().setLocale(locale); return child ?? const SizedBox.shrink(); }, - home: const ScannerScreen(), + home: (PlatformInfo.isWeb && !PlatformInfo.isChrome) + ? const ChromeRequiredScreen() + : const ScannerScreen(), ); }, ), diff --git a/lib/screens/chrome_required_screen.dart b/lib/screens/chrome_required_screen.dart new file mode 100644 index 0000000..a229c0a --- /dev/null +++ b/lib/screens/chrome_required_screen.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; +import '../l10n/l10n.dart'; + +class ChromeRequiredScreen extends StatelessWidget { + const ChromeRequiredScreen({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final theme = Theme.of(context); + final isDark = theme.brightness == Brightness.dark; + + return Scaffold( + body: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(horizontal: 32), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: isDark + ? [const Color(0xFF1A1A1A), const Color(0xFF0D0D0D)] + : [const Color(0xFFF5F7FA), const Color(0xFFE4E7EB)], + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: Colors.orange.withValues(alpha: 0.1), + shape: BoxShape.circle, + ), + child: const Icon( + Icons.browser_not_supported_rounded, + size: 80, + color: Colors.orange, + ), + ), + const SizedBox(height: 32), + Text( + l10n.scanner_chromeRequired, + textAlign: TextAlign.center, + style: theme.textTheme.headlineMedium?.copyWith( + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : Colors.black87, + ), + ), + const SizedBox(height: 16), + Text( + l10n.scanner_chromeRequiredMessage, + textAlign: TextAlign.center, + style: theme.textTheme.bodyLarge?.copyWith( + color: isDark ? Colors.white70 : Colors.black54, + height: 1.5, + ), + ), + const SizedBox(height: 48), + // We can't really "fix" it for them other than telling them to use Chrome + // but we can provide a nice visual. + Container( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), + decoration: BoxDecoration( + color: Colors.blue.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(30), + border: Border.all( + color: Colors.blue.withValues(alpha: 0.3), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.info_outline, size: 20, color: Colors.blue), + const SizedBox(width: 12), + Text( + "Web Bluetooth requires a Chromium browser", + style: theme.textTheme.bodyMedium?.copyWith( + color: Colors.blue, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/utils/browser_detection.dart b/lib/utils/browser_detection.dart new file mode 100644 index 0000000..aafb838 --- /dev/null +++ b/lib/utils/browser_detection.dart @@ -0,0 +1,2 @@ +export 'browser_detection_stub.dart' + if (dart.library.html) 'browser_detection_web.dart'; diff --git a/lib/utils/browser_detection_stub.dart b/lib/utils/browser_detection_stub.dart new file mode 100644 index 0000000..f872d9a --- /dev/null +++ b/lib/utils/browser_detection_stub.dart @@ -0,0 +1,3 @@ +class BrowserDetection { + static bool get isChrome => false; +} diff --git a/lib/utils/browser_detection_web.dart b/lib/utils/browser_detection_web.dart new file mode 100644 index 0000000..e5b4b69 --- /dev/null +++ b/lib/utils/browser_detection_web.dart @@ -0,0 +1,15 @@ +// ignore: avoid_web_libraries_in_flutter +import 'dart:html' as html; + +class BrowserDetection { + static bool get isChrome { + final userAgent = html.window.navigator.userAgent.toLowerCase(); + final vendor = html.window.navigator.vendor.toLowerCase(); + + // Chrome UA typically contains 'chrome' and vendor is 'Google Inc.' + // This also excludes Firefox, Safari, and sometimes Edge/Brave depending on strictness. + // For Web Bluetooth, Chrome, Edge (latest), and Brave usually work. + // But we'll follow the user's request for "isChrome". + return userAgent.contains('chrome') && vendor.contains('google'); + } +} diff --git a/lib/utils/platform_info.dart b/lib/utils/platform_info.dart index 399bf13..dc8e27e 100644 --- a/lib/utils/platform_info.dart +++ b/lib/utils/platform_info.dart @@ -1,5 +1,6 @@ import 'package:flutter/foundation.dart'; import 'dart:io' show Platform; +import 'browser_detection.dart'; /// Utility class to safely check the current platform across web and native. /// @@ -9,6 +10,9 @@ class PlatformInfo { /// Whether the app is running in a web browser. static bool get isWeb => kIsWeb; + /// Whether the app is running in the Chrome browser (only relevant if [isWeb] is true). + static bool get isChrome => isWeb && BrowserDetection.isChrome; + /// Whether the app is running on Android. static bool get isAndroid => !kIsWeb && Platform.isAndroid;