From 8ba4bbfbc5d3d1a8aab94c4da8f730d24ab5cbe6 Mon Sep 17 00:00:00 2001 From: just-stuff-tm Date: Fri, 10 Apr 2026 14:25:53 -0400 Subject: [PATCH] add auto clock synchronization setting after repeater login Introduced a new setting for automatic clock synchronization after a successful repeater login. Added localization support for the new feature in multiple languages (Bulgarian, German, English, Spanish, French, Hungarian, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Russian, Slovak, Slovenian, Swedish, Ukrainian, Chinese). Implemented storage service methods to manage the new setting. Updated the repeater settings screen to include a toggle for the new feature. Enhanced the repeater login dialog to trigger clock synchronization automatically if the setting is enabled. --- lib/l10n/app_bg.arb | 10 ++++++- lib/l10n/app_de.arb | 10 ++++++- lib/l10n/app_en.arb | 8 ++++++ lib/l10n/app_es.arb | 10 ++++++- lib/l10n/app_fr.arb | 10 ++++++- lib/l10n/app_hu.arb | 13 +++++++-- lib/l10n/app_it.arb | 10 ++++++- lib/l10n/app_ja.arb | 10 ++++++- lib/l10n/app_ko.arb | 10 ++++++- lib/l10n/app_localizations.dart | 12 ++++++++ lib/l10n/app_localizations_bg.dart | 8 ++++++ lib/l10n/app_localizations_de.dart | 8 ++++++ lib/l10n/app_localizations_en.dart | 7 +++++ lib/l10n/app_localizations_es.dart | 8 ++++++ lib/l10n/app_localizations_fr.dart | 8 ++++++ lib/l10n/app_localizations_hu.dart | 8 ++++++ lib/l10n/app_localizations_it.dart | 8 ++++++ lib/l10n/app_localizations_ja.dart | 7 +++++ lib/l10n/app_localizations_ko.dart | 7 +++++ lib/l10n/app_localizations_nl.dart | 8 ++++++ lib/l10n/app_localizations_pl.dart | 8 ++++++ lib/l10n/app_localizations_pt.dart | 8 ++++++ lib/l10n/app_localizations_ru.dart | 8 ++++++ lib/l10n/app_localizations_sk.dart | 8 ++++++ lib/l10n/app_localizations_sl.dart | 7 +++++ lib/l10n/app_localizations_sv.dart | 8 ++++++ lib/l10n/app_localizations_uk.dart | 7 +++++ lib/l10n/app_localizations_zh.dart | 6 ++++ lib/l10n/app_nl.arb | 10 ++++++- lib/l10n/app_pl.arb | 12 ++++++-- lib/l10n/app_pt.arb | 10 ++++++- lib/l10n/app_ru.arb | 12 ++++++-- lib/l10n/app_sk.arb | 10 ++++++- lib/l10n/app_sl.arb | 10 ++++++- lib/l10n/app_sv.arb | 12 ++++++-- lib/l10n/app_uk.arb | 12 ++++++-- lib/l10n/app_zh.arb | 10 ++++++- lib/screens/repeater_settings_screen.dart | 28 +++++++++++++++++++ lib/services/storage_service.dart | 34 +++++++++++++++++++++++ lib/widgets/repeater_login_dialog.dart | 23 +++++++++++++++ 40 files changed, 400 insertions(+), 23 deletions(-) diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index 567ed24..718bfd9 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -2061,5 +2061,13 @@ "scanner_linuxPairingHidePin": "Скриване на PIN кода", "scanner_linuxPairingShowPin": "Покажи PIN", "repeater_cliQuickClockSync": "Синхронизация на часовника", - "repeater_cliQuickDiscovery": "Открий Съседи" + "repeater_cliQuickDiscovery": "Открий Съседи", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Автоматично изпращайте съобщение \"синхронизиране на часовника\" след успешно влизане.", + "repeater_clockSyncAfterLogin": "Синхронизиране на часовника след влизане" } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 2503372..54683d2 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -2089,5 +2089,13 @@ "scanner_linuxPairingPinTitle": "Bluetooth-Paarungs-PIN", "scanner_linuxPairingPinPrompt": "Geben Sie die PIN für {deviceName} ein (leer lassen, falls keine).", "repeater_cliQuickClockSync": "Uhr Synchronisieren", - "repeater_cliQuickDiscovery": "Entdecke Nachbarn" + "repeater_cliQuickDiscovery": "Entdecke Nachbarn", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLogin": "Uhrzeit-Synchronisation nach dem Anmelden", + "repeater_clockSyncAfterLoginSubtitle": "Automatisch \"Uhrzeit-Synchronisierung\" nach erfolgreicher Anmeldung senden." } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index ffdf21d..1ac2357 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1116,6 +1116,14 @@ "repeater_neighborsSubtitle": "View zero hop neighbors.", "repeater_settings": "Settings", "repeater_settingsSubtitle": "Configure repeater parameters", + "repeater_clockSyncAfterLogin": "Clock sync after login", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "repeater_clockSyncAfterLoginSubtitle": "Automatically send \"clock sync\" after a successful login", + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, "repeater_statusTitle": "Repeater Status", "repeater_routingMode": "Routing mode", "repeater_autoUseSavedPath": "Auto (use saved path)", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 5d98e4e..6f95d81 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -2089,5 +2089,13 @@ "translation_translationOptions": "Opciones de traducción", "translation_systemLanguage": "Idioma del sistema", "repeater_cliQuickDiscovery": "Descubrir Vecinos", - "repeater_cliQuickClockSync": "Sincronización del reloj" + "repeater_cliQuickClockSync": "Sincronización del reloj", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Enviar automáticamente la función de \"sincronización de reloj\" después de un inicio de sesión exitoso.", + "repeater_clockSyncAfterLogin": "Sincronización del reloj después de iniciar sesión" } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 00b861e..4b0497b 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -2061,5 +2061,13 @@ "scanner_linuxPairingPinPrompt": "Entrez le code PIN pour {deviceName} (laissez vide si nécessaire).", "scanner_linuxPairingShowPin": "Afficher le code PIN", "repeater_cliQuickClockSync": "Synchronisation de l'horloge", - "repeater_cliQuickDiscovery": "Découvrir les voisins" + "repeater_cliQuickDiscovery": "Découvrir les voisins", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Envoyer automatiquement une notification \"synchronisation de l'heure\" après une connexion réussie.", + "repeater_clockSyncAfterLogin": "Synchronisation de l'horloge après la connexion" } diff --git a/lib/l10n/app_hu.arb b/lib/l10n/app_hu.arb index e7671a4..3553b18 100644 --- a/lib/l10n/app_hu.arb +++ b/lib/l10n/app_hu.arb @@ -2081,7 +2081,7 @@ } }, "scanner_linuxPairingShowPin": "Megjelenítse a PIN-kódot", - "scanner_linuxPairingPinPrompt": "Adja meg a PIN kódot a {deviceName} számára (hagyja üresen, ha nincs).", + "scanner_linuxPairingPinPrompt": "Adja meg a(z) {deviceName} PIN-kódját (hagyja üresen, ha nincs).", "scanner_linuxPairingHidePin": "Rejtse el a PIN-kódot", "scanner_linuxPairingPinTitle": "Bluetooth párosítási PIN", "@translation_translateTo": { @@ -2098,7 +2098,14 @@ "translation_translateTo": "Fordítás {language}-ra", "translation_translationOptions": "Fordítási lehetőségek", "translation_systemLanguage": "Rendszer nyelvé", - "scanner_linuxPairingPinPrompt": "Adja meg a(z) {deviceName} PIN-kódját (hagyja üresen, ha nincs).", "repeater_cliQuickClockSync": "Óra szinkronizálás", - "repeater_cliQuickDiscovery": "Fedezd fel a szomszédokat" + "repeater_cliQuickDiscovery": "Fedezd fel a szomszédokat", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Automatikusan küldje el a \"óra szinkronizálás\" üzenetet a sikeres bejelentkezés után.", + "repeater_clockSyncAfterLogin": "Óra szinkronizálás bejelentkezés után" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 6ebe4f9..d0e195e 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -2061,5 +2061,13 @@ "scanner_linuxPairingPinTitle": "PIN per l'accoppiamento Bluetooth", "scanner_linuxPairingHidePin": "Nascondi il PIN", "repeater_cliQuickClockSync": "Sincronizzazione dell'orologio", - "repeater_cliQuickDiscovery": "Scopri i Vicini" + "repeater_cliQuickDiscovery": "Scopri i Vicini", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Invia automaticamente il comando \"sincronizzazione dell'orologio\" dopo un login riuscito.", + "repeater_clockSyncAfterLogin": "Sincronizzazione dell'orologio dopo il login" } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index bc38720..6f85116 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -2099,5 +2099,13 @@ "scanner_linuxPairingPinTitle": "Bluetooth ペアリング PIN", "scanner_linuxPairingPinPrompt": "{deviceName}のPINを入力してください(なしの場合は空欄のまま)。", "repeater_cliQuickClockSync": "クロック同期", - "repeater_cliQuickDiscovery": "近隣を発見する" + "repeater_cliQuickDiscovery": "近隣を発見する", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLogin": "ログイン後、時計の時刻を同期する", + "repeater_clockSyncAfterLoginSubtitle": "ログインが成功した場合、自動的に「時刻同期」を送信する。" } diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index f63badc..bd73847 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -2099,5 +2099,13 @@ "translation_translationOptions": "번역 옵션", "translation_systemLanguage": "시스템 언어", "repeater_cliQuickClockSync": "시계 동기화", - "repeater_cliQuickDiscovery": "이웃 발견하기" + "repeater_cliQuickDiscovery": "이웃 발견하기", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLogin": "로그인 후 시계 동기화", + "repeater_clockSyncAfterLoginSubtitle": "성공적인 로그인 후, 자동으로 \"시간 동기화\"를 전송합니다." } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index bb390d5..efcbd0f 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -3675,6 +3675,18 @@ abstract class AppLocalizations { /// **'Configure repeater parameters'** String get repeater_settingsSubtitle; + /// Repeater setting: auto sync device clock after successful login + /// + /// In en, this message translates to: + /// **'Clock sync after login'** + String get repeater_clockSyncAfterLogin; + + /// Repeater setting subtitle: describes the clock sync after login behavior + /// + /// In en, this message translates to: + /// **'Automatically send \"clock sync\" after a successful login'** + String get repeater_clockSyncAfterLoginSubtitle; + /// No description provided for @repeater_statusTitle. /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index bec54df..bb07229 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -2056,6 +2056,14 @@ class AppLocalizationsBg extends AppLocalizations { String get repeater_settingsSubtitle => 'Конфигурирайте параметрите на репитера'; + @override + String get repeater_clockSyncAfterLogin => + 'Синхронизиране на часовника след влизане'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Автоматично изпращайте съобщение \"синхронизиране на часовника\" след успешно влизане.'; + @override String get repeater_statusTitle => 'Статус на повтарянето'; diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 078c9e9..49cf19a 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -2052,6 +2052,14 @@ class AppLocalizationsDe extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Repeater-parameter konfigurieren'; + @override + String get repeater_clockSyncAfterLogin => + 'Uhrzeit-Synchronisation nach dem Anmelden'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Automatisch \"Uhrzeit-Synchronisierung\" nach erfolgreicher Anmeldung senden.'; + @override String get repeater_statusTitle => 'Repeaterstatus'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index d7a79bd..e13934b 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -2014,6 +2014,13 @@ class AppLocalizationsEn extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Configure repeater parameters'; + @override + String get repeater_clockSyncAfterLogin => 'Clock sync after login'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Automatically send \"clock sync\" after a successful login'; + @override String get repeater_statusTitle => 'Repeater Status'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 9a56c6d..ddb9b6e 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -2050,6 +2050,14 @@ class AppLocalizationsEs extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Configurar parámetros del repetidor'; + @override + String get repeater_clockSyncAfterLogin => + 'Sincronización del reloj después de iniciar sesión'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Enviar automáticamente la función de \"sincronización de reloj\" después de un inicio de sesión exitoso.'; + @override String get repeater_statusTitle => 'Estado del Repetidor'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 4ce4a75..fbe106d 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -2062,6 +2062,14 @@ class AppLocalizationsFr extends AppLocalizations { String get repeater_settingsSubtitle => 'Configurer les paramètres du répéteur'; + @override + String get repeater_clockSyncAfterLogin => + 'Synchronisation de l\'horloge après la connexion'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Envoyer automatiquement une notification \"synchronisation de l\'heure\" après une connexion réussie.'; + @override String get repeater_statusTitle => 'État du répéteur'; diff --git a/lib/l10n/app_localizations_hu.dart b/lib/l10n/app_localizations_hu.dart index 5d305ee..920efd8 100644 --- a/lib/l10n/app_localizations_hu.dart +++ b/lib/l10n/app_localizations_hu.dart @@ -2066,6 +2066,14 @@ class AppLocalizationsHu extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Állítsa be a repeater paramétereket'; + @override + String get repeater_clockSyncAfterLogin => + 'Óra szinkronizálás bejelentkezés után'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Automatikusan küldje el a \"óra szinkronizálás\" üzenetet a sikeres bejelentkezés után.'; + @override String get repeater_statusTitle => 'Adatkapcsolódás állapot'; diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index 98cbfcb..b492d6a 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -2053,6 +2053,14 @@ class AppLocalizationsIt extends AppLocalizations { String get repeater_settingsSubtitle => 'Configura i parametri del ripetitore'; + @override + String get repeater_clockSyncAfterLogin => + 'Sincronizzazione dell\'orologio dopo il login'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Invia automaticamente il comando \"sincronizzazione dell\'orologio\" dopo un login riuscito.'; + @override String get repeater_statusTitle => 'Stato del Ripetitore'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index fc59852..daebcba 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -1965,6 +1965,13 @@ class AppLocalizationsJa extends AppLocalizations { @override String get repeater_settingsSubtitle => 'リピーターのパラメータを設定する'; + @override + String get repeater_clockSyncAfterLogin => 'ログイン後、時計の時刻を同期する'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'ログインが成功した場合、自動的に「時刻同期」を送信する。'; + @override String get repeater_statusTitle => '再送ステータス'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index b0d849b..605cc96 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -1962,6 +1962,13 @@ class AppLocalizationsKo extends AppLocalizations { @override String get repeater_settingsSubtitle => '리피터 파라미터 설정'; + @override + String get repeater_clockSyncAfterLogin => '로그인 후 시계 동기화'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + '성공적인 로그인 후, 자동으로 \"시간 동기화\"를 전송합니다.'; + @override String get repeater_statusTitle => '반복 장치 상태'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 6fcad22..3d1644f 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -2038,6 +2038,14 @@ class AppLocalizationsNl extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Configureer repeaterparameters'; + @override + String get repeater_clockSyncAfterLogin => + 'Na het inloggen, klok synchroniseren'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Automatisch een \"klok synchroniseren\" bericht versturen na een succesvolle inlog.'; + @override String get repeater_statusTitle => 'Status repeater'; diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index 8492702..f0006b1 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -2066,6 +2066,14 @@ class AppLocalizationsPl extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Skonfiguruj parametry przekaźnika'; + @override + String get repeater_clockSyncAfterLogin => + 'Synchronizacja zegara po zalogowaniu'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Automatycznie wysyłaj powiadomienie \"synchronizacja zegara\" po pomyślnym zalogowaniu.'; + @override String get repeater_statusTitle => 'Status przekaźnika'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index ce7c9e8..f4b7ffc 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -2050,6 +2050,14 @@ class AppLocalizationsPt extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Configurar parâmetros do repetidor'; + @override + String get repeater_clockSyncAfterLogin => + 'Sincronização do relógio após o login'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Enviar automaticamente a sincronização do \"relógio\" após um login bem-sucedido.'; + @override String get repeater_statusTitle => 'Status do Repetidor'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 4557885..dcd9d9c 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -2054,6 +2054,14 @@ class AppLocalizationsRu extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Настройка параметров репитера'; + @override + String get repeater_clockSyncAfterLogin => + 'Синхронизация часов после входа в систему'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Автоматически отправлять сообщение \"синхронизация времени\" после успешной авторизации.'; + @override String get repeater_statusTitle => 'Статус репитера'; diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index b59d6d8..7323ddc 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -2039,6 +2039,14 @@ class AppLocalizationsSk extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Konfigurujte parametre opakovača'; + @override + String get repeater_clockSyncAfterLogin => + 'Synchronizácia hodiniek po prihlávení'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Automaticky posielajte notifikáciu \"synchronizácia času\" po úspešnom prihládení.'; + @override String get repeater_statusTitle => 'Status opakého zboru'; diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index e5bf031..a374d4b 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -2038,6 +2038,13 @@ class AppLocalizationsSl extends AppLocalizations { String get repeater_settingsSubtitle => 'Konfigurirajte parametre ponovitelja'; + @override + String get repeater_clockSyncAfterLogin => 'Sinhronizacija ure po prijavi'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Samodejno po uspešnem vstopu pošljite obvestilo o sinhronizaciji časa.'; + @override String get repeater_statusTitle => 'Status ponovitelja'; diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index 731b846..6e2f563 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -2025,6 +2025,14 @@ class AppLocalizationsSv extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Konfigurera återspolarparametrar'; + @override + String get repeater_clockSyncAfterLogin => + 'Synkronisera klockan efter inloggning'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Automatiskt skicka \"klocksynkronisering\" efter en lyckad inloggning.'; + @override String get repeater_statusTitle => 'Återspelsstatus'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index 1b5a800..dd189eb 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -2050,6 +2050,13 @@ class AppLocalizationsUk extends AppLocalizations { @override String get repeater_settingsSubtitle => 'Налаштувати параметри ретранслятора'; + @override + String get repeater_clockSyncAfterLogin => 'Синхронізація годин після входу'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => + 'Автоматично надсилати повідомлення \"синхронізація годин\" після успішного входу.'; + @override String get repeater_statusTitle => 'Статус ретранслятора'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index acadc58..b48b31d 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -1923,6 +1923,12 @@ class AppLocalizationsZh extends AppLocalizations { @override String get repeater_settingsSubtitle => '配置转发节点参数'; + @override + String get repeater_clockSyncAfterLogin => '登录后,自动同步时钟'; + + @override + String get repeater_clockSyncAfterLoginSubtitle => '在成功登录后,自动发送“时钟同步”指令。'; + @override String get repeater_statusTitle => '转发节点状态'; diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 490c269..abfd5e7 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -2061,5 +2061,13 @@ "scanner_linuxPairingPinPrompt": "Voer PIN in voor {deviceName} (laat leeg als er geen is).", "scanner_linuxPairingPinTitle": "Bluetooth‑koppelings‑PIN", "repeater_cliQuickDiscovery": "Ontdek Buren", - "repeater_cliQuickClockSync": "Kloksynchronisatie" + "repeater_cliQuickClockSync": "Kloksynchronisatie", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Automatisch een \"klok synchroniseren\" bericht versturen na een succesvolle inlog.", + "repeater_clockSyncAfterLogin": "Na het inloggen, klok synchroniseren" } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 928bd0d..e626708 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -2099,5 +2099,13 @@ "scanner_linuxPairingPinPrompt": "Wprowadź kod PIN dla {deviceName} (pozostaw puste, jeśli brak).", "scanner_linuxPairingPinTitle": "Kod PIN parowania Bluetooth", "repeater_cliQuickClockSync": "Synchronizacja zegara", - "repeater_cliQuickDiscovery": "Odkryj Sąsiadów" -} \ No newline at end of file + "repeater_cliQuickDiscovery": "Odkryj Sąsiadów", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLogin": "Synchronizacja zegara po zalogowaniu", + "repeater_clockSyncAfterLoginSubtitle": "Automatycznie wysyłaj powiadomienie \"synchronizacja zegara\" po pomyślnym zalogowaniu." +} diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 8693a28..bacc1ca 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -2061,5 +2061,13 @@ "scanner_linuxPairingPinPrompt": "Insira o PIN para {deviceName} (deixe em branco se não houver).", "scanner_linuxPairingPinTitle": "PIN de emparelhamento Bluetooth", "repeater_cliQuickClockSync": "Sincronização do Relógio", - "repeater_cliQuickDiscovery": "Descobrir Vizinhos" + "repeater_cliQuickDiscovery": "Descobrir Vizinhos", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Enviar automaticamente a sincronização do \"relógio\" após um login bem-sucedido.", + "repeater_clockSyncAfterLogin": "Sincronização do relógio após o login" } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index bdb9bee..e4dad42 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1301,5 +1301,13 @@ "scanner_linuxPairingHidePin": "Скрыть PIN", "scanner_linuxPairingPinTitle": "PIN‑код сопряжения Bluetooth", "repeater_cliQuickDiscovery": "Обнаружить Соседей", - "repeater_cliQuickClockSync": "Синхронизация часов" -} \ No newline at end of file + "repeater_cliQuickClockSync": "Синхронизация часов", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLogin": "Синхронизация часов после входа в систему", + "repeater_clockSyncAfterLoginSubtitle": "Автоматически отправлять сообщение \"синхронизация времени\" после успешной авторизации." +} diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb index 50d42d2..937bacb 100644 --- a/lib/l10n/app_sk.arb +++ b/lib/l10n/app_sk.arb @@ -2061,5 +2061,13 @@ "translation_translationOptions": "Možnosti prekladania", "translation_systemLanguage": "Jazyk systému", "repeater_cliQuickClockSync": "Synchronizácia hodin", - "repeater_cliQuickDiscovery": "Objaviť susedov" + "repeater_cliQuickDiscovery": "Objaviť susedov", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLogin": "Synchronizácia hodiniek po prihlávení", + "repeater_clockSyncAfterLoginSubtitle": "Automaticky posielajte notifikáciu \"synchronizácia času\" po úspešnom prihládení." } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index 6fc76a8..58d0f9e 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -2061,5 +2061,13 @@ "scanner_linuxPairingPinPrompt": "Vnesite PIN za {deviceName} (pustite prazno, če ga ni).", "scanner_linuxPairingPinTitle": "Bluetooth PIN za seznanjanje", "repeater_cliQuickDiscovery": "Odkrijte sosede", - "repeater_cliQuickClockSync": "Usklajevanje ure" + "repeater_cliQuickClockSync": "Usklajevanje ure", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Samodejno po uspešnem vstopu pošljite obvestilo o sinhronizaciji časa.", + "repeater_clockSyncAfterLogin": "Sinhronizacija ure po prijavi" } diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index eb7de6c..59b27a4 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -2061,5 +2061,13 @@ "scanner_linuxPairingPinPrompt": "Ange PIN för {deviceName} (lämna tomt om ingen).", "scanner_linuxPairingHidePin": "Dölj PIN", "repeater_cliQuickDiscovery": "Upptäck grannar", - "repeater_cliQuickClockSync": "Synkronisera klocka" -} \ No newline at end of file + "repeater_cliQuickClockSync": "Synkronisera klocka", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Automatiskt skicka \"klocksynkronisering\" efter en lyckad inloggning.", + "repeater_clockSyncAfterLogin": "Synkronisera klockan efter inloggning" +} diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 3fac32b..c19f3bd 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -2061,5 +2061,13 @@ "scanner_linuxPairingPinPrompt": "Введіть PIN для {deviceName} (залиште порожнім, якщо його немає).", "scanner_linuxPairingHidePin": "Приховати PIN", "repeater_cliQuickClockSync": "Синхронізація годинника", - "repeater_cliQuickDiscovery": "Відкрити сусідів" -} \ No newline at end of file + "repeater_cliQuickDiscovery": "Відкрити сусідів", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLoginSubtitle": "Автоматично надсилати повідомлення \"синхронізація годин\" після успішного входу.", + "repeater_clockSyncAfterLogin": "Синхронізація годин після входу" +} diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index f054f79..3fbfc39 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -2066,5 +2066,13 @@ "translation_translationOptions": "翻译选项", "translation_systemLanguage": "系统语言", "repeater_cliQuickDiscovery": "发现邻居", - "repeater_cliQuickClockSync": "同步时钟" + "repeater_cliQuickClockSync": "同步时钟", + "@repeater_clockSyncAfterLogin": { + "description": "Repeater setting: auto sync device clock after successful login" + }, + "@repeater_clockSyncAfterLoginSubtitle": { + "description": "Repeater setting subtitle: describes the clock sync after login behavior" + }, + "repeater_clockSyncAfterLogin": "登录后,自动同步时钟", + "repeater_clockSyncAfterLoginSubtitle": "在成功登录后,自动发送“时钟同步”指令。" } diff --git a/lib/screens/repeater_settings_screen.dart b/lib/screens/repeater_settings_screen.dart index 6375e0b..d0236bb 100644 --- a/lib/screens/repeater_settings_screen.dart +++ b/lib/screens/repeater_settings_screen.dart @@ -8,6 +8,7 @@ import '../connector/meshcore_connector.dart'; import '../connector/meshcore_protocol.dart'; import '../services/app_debug_log_service.dart'; import '../services/repeater_command_service.dart'; +import '../services/storage_service.dart'; import '../widgets/path_management_dialog.dart'; class RepeaterSettingsScreen extends StatefulWidget { @@ -25,6 +26,8 @@ class RepeaterSettingsScreen extends StatefulWidget { } class _RepeaterSettingsScreenState extends State { + final StorageService _storage = StorageService(); + bool _isLoading = false; bool _hasChanges = false; bool _refreshingBasic = false; @@ -59,6 +62,7 @@ class _RepeaterSettingsScreenState extends State { bool _repeatEnabled = true; bool _allowReadOnly = true; bool _privacyMode = false; + bool _autoClockSyncAfterLogin = false; // Advertisement settings bool _advertEnable = true; @@ -566,6 +570,15 @@ class _RepeaterSettingsScreenState extends State { _lonController.text = widget.repeater.longitude?.toString() ?? ''; } }); + + final autoClockSync = await _storage + .getRepeaterAutoClockSyncAfterLoginEnabled( + widget.repeater.publicKeyHex, + ); + if (!mounted) return; + setState(() { + _autoClockSyncAfterLogin = autoClockSync; + }); } Future _saveSettings() async { @@ -1139,6 +1152,21 @@ class _RepeaterSettingsScreenState extends State { onRefresh: _refreshAllowReadOnly, refreshTooltip: l10n.repeater_refreshGuestAccess, ), + SwitchListTile( + title: Text(l10n.repeater_clockSyncAfterLogin), + subtitle: Text(l10n.repeater_clockSyncAfterLoginSubtitle), + value: _autoClockSyncAfterLogin, + onChanged: (value) async { + setState(() { + _autoClockSyncAfterLogin = value; + }); + await _storage.setRepeaterAutoClockSyncAfterLoginEnabled( + widget.repeater.publicKeyHex, + value, + ); + }, + contentPadding: EdgeInsets.zero, + ), // Privacy mode - hidden until fully implemented // _buildFeatureToggleRow( // title: l10n.repeater_privacyMode, diff --git a/lib/services/storage_service.dart b/lib/services/storage_service.dart index a86c1f6..0c78c59 100644 --- a/lib/services/storage_service.dart +++ b/lib/services/storage_service.dart @@ -7,8 +7,42 @@ class StorageService { static const String _pathHistoryPrefix = 'path_history_'; static const String _pendingMessagesKey = 'pending_messages'; static const String _repeaterPasswordsKey = 'repeater_passwords'; + static const String _repeaterAutoClockSyncAfterLoginKey = + 'repeater_auto_clock_sync_after_login'; static const String _deliveryObservationsKey = 'delivery_observations'; + Future> _loadRepeaterAutoClockSyncAfterLogin() async { + final prefs = PrefsManager.instance; + final jsonStr = prefs.getString(_repeaterAutoClockSyncAfterLoginKey); + + if (jsonStr == null) return {}; + + try { + final json = jsonDecode(jsonStr) as Map; + return json.map((key, value) => MapEntry(key, value == true)); + } catch (e) { + return {}; + } + } + + Future getRepeaterAutoClockSyncAfterLoginEnabled( + String repeaterPubKeyHex, + ) async { + final settings = await _loadRepeaterAutoClockSyncAfterLogin(); + return settings[repeaterPubKeyHex] ?? false; + } + + Future setRepeaterAutoClockSyncAfterLoginEnabled( + String repeaterPubKeyHex, + bool enabled, + ) async { + final prefs = PrefsManager.instance; + final settings = await _loadRepeaterAutoClockSyncAfterLogin(); + settings[repeaterPubKeyHex] = enabled; + final jsonStr = jsonEncode(settings); + await prefs.setString(_repeaterAutoClockSyncAfterLoginKey, jsonStr); + } + Future savePathHistory( String contactPubKeyHex, ContactPathHistory history, diff --git a/lib/widgets/repeater_login_dialog.dart b/lib/widgets/repeater_login_dialog.dart index 48bb6ac..521cfd2 100644 --- a/lib/widgets/repeater_login_dialog.dart +++ b/lib/widgets/repeater_login_dialog.dart @@ -187,6 +187,29 @@ class _RepeaterLoginDialogState extends State { await _storage.removeRepeaterPassword(widget.repeater.publicKeyHex); } + final autoClockSync = await _storage + .getRepeaterAutoClockSyncAfterLoginEnabled( + widget.repeater.publicKeyHex, + ); + if (autoClockSync) { + try { + final timestampSeconds = + DateTime.now().millisecondsSinceEpoch ~/ 1000; + await _connector.sendFrame( + buildSendCliCommandFrame( + repeater.publicKey, + 'clock sync', + timestampSeconds: timestampSeconds, + ), + ); + } catch (e) { + appLogger.warn( + 'Auto clock sync failed for ${repeater.name}: $e', + tag: 'RepeaterLogin', + ); + } + } + if (mounted) { Navigator.pop(context, password); Future.microtask(() => widget.onLogin(password));