feat: Hidden wifi ssid support (#2360)

This commit is contained in:
Mr.Catfood
2026-07-13 02:33:48 -04:00
committed by GitHub
parent 73ab9ab20d
commit bfa1d706b1
28 changed files with 253 additions and 21 deletions
+2
View File
@@ -301,3 +301,5 @@ STR_STEP_HINT_SIDE: "Бакавыя кнопкі:"
STR_AUTO_TURN_ENABLED: "Аўтаперагортванне: "
STR_AUTO_TURN_PAGES_PER_MIN: "Аўтаперагортванне (старонак за хвіліну)"
STR_TILT_PAGE_TURN: "Перагортванне нахілам"
STR_ADD_HIDDEN_NETWORK: "Дадаць схаваную сетку..."
STR_ENTER_WIFI_SSID: "Увядзіце назву сеткі (SSID)"
+2
View File
@@ -390,3 +390,5 @@ STR_FIRMWARE_WRITE_FAILED: "Ha fallat l'escriptura del firmware"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "No apaguis el dispositiu!"
STR_RECOVERY_MODE: "Mode de recuperació"
STR_RECOVERY_MODE_HINT: "Posa firmware.bin a l'arrel de la targeta SD i selecciona'l"
STR_ADD_HIDDEN_NETWORK: "Afegeix una xarxa oculta..."
STR_ENTER_WIFI_SSID: "Introdueix el nom de la xarxa (SSID)"
+2
View File
@@ -276,3 +276,5 @@ STR_SLEEP_NEVER: "Nikdy"
STR_STEP_HINT_FRONT: "Přední tlačítka:"
STR_STEP_HINT_SIDE: "Boční tlačítka:"
STR_TILT_PAGE_TURN: "Otáčení stránek nakloněním"
STR_ADD_HIDDEN_NETWORK: "Přidat skrytou síť..."
STR_ENTER_WIFI_SSID: "Zadejte název sítě (SSID)"
+2
View File
@@ -304,3 +304,5 @@ STR_SCREENSHOT_BUTTON: "Tag skærmbillede"
STR_AUTO_TURN_ENABLED: "Automatisk sidevendning aktiveret: "
STR_AUTO_TURN_PAGES_PER_MIN: "Automatisk vending (sider per minut)"
STR_TILT_PAGE_TURN: "Vip for at vende side"
STR_ADD_HIDDEN_NETWORK: "Tilføj skjult netværk..."
STR_ENTER_WIFI_SSID: "Indtast netværksnavn (SSID)"
+2
View File
@@ -304,3 +304,5 @@ STR_SCREENSHOT_BUTTON: "Screenshot maken"
STR_AUTO_TURN_ENABLED: "Automatisch omslaan ingeschakeld: "
STR_AUTO_TURN_PAGES_PER_MIN: "Autom. omslaan (pagina's per minuut)"
STR_TILT_PAGE_TURN: "Kantel om te bladeren"
STR_ADD_HIDDEN_NETWORK: "Verborgen netwerk toevoegen..."
STR_ENTER_WIFI_SSID: "Voer netwerknaam in (SSID)"
+2
View File
@@ -53,6 +53,8 @@ STR_NETWORK_LEGEND: "* = Encrypted | + = Saved"
STR_MAC_ADDRESS: "MAC address:"
STR_CHECKING_WIFI: "Checking Wi-Fi..."
STR_ENTER_WIFI_PASSWORD: "Enter Wi-Fi password"
STR_ADD_HIDDEN_NETWORK: "Add hidden network..."
STR_ENTER_WIFI_SSID: "Enter network name (SSID)"
STR_TO_PREFIX: "to "
STR_CALIBRE_RECEIVING: "Receiving: "
STR_CALIBRE_RECEIVED: "Received: "
+2
View File
@@ -274,3 +274,5 @@ STR_SLEEP_NEVER: "Ei koskaan"
STR_STEP_HINT_FRONT: "Etupainikkeet:"
STR_STEP_HINT_SIDE: "Sivupainikkeet:"
STR_TILT_PAGE_TURN: "Sivunkääntö kallistamalla"
STR_ADD_HIDDEN_NETWORK: "Lisää piilotettu verkko..."
STR_ENTER_WIFI_SSID: "Anna verkon nimi (SSID)"
+2
View File
@@ -305,3 +305,5 @@ STR_SCREENSHOT_BUTTON: "Capture d'écran"
STR_AUTO_TURN_ENABLED: "Tourne-page auto : "
STR_AUTO_TURN_PAGES_PER_MIN: "Tourne-page auto (pages par minute)"
STR_TILT_PAGE_TURN: "Tourner par inclinaison"
STR_ADD_HIDDEN_NETWORK: "Ajouter un réseau masqué..."
STR_ENTER_WIFI_SSID: "Saisir le nom du réseau (SSID)"
+2
View File
@@ -381,3 +381,5 @@ STR_FIRMWARE_WRITE_FAILED: "Schreiben der Firmware-Datei ist fehlgeschlagen"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Nicht ausschalten!"
STR_RECOVERY_MODE: "Wiederherstellungsmodus"
STR_RECOVERY_MODE_HINT: "Lege firmware.bin im SD-Kartenwurzelverzeichnis ab und wähle es aus"
STR_ADD_HIDDEN_NETWORK: "Verstecktes Netzwerk hinzufügen..."
STR_ENTER_WIFI_SSID: "Netzwerknamen eingeben (SSID)"
+2
View File
@@ -392,3 +392,5 @@ STR_SLEEP_TIMER_VALUE_FORMAT: "%u דקות"
STR_SLEEP_NEVER: "אף פעם"
STR_STEP_HINT_FRONT: "לחצנים קדמיים:"
STR_STEP_HINT_SIDE: "לחצני צד:"
STR_ADD_HIDDEN_NETWORK: "הוסף רשת מוסתרת..."
STR_ENTER_WIFI_SSID: "הזן שם רשת (SSID)"
+92
View File
@@ -49,6 +49,8 @@ STR_NETWORK_LEGEND: "* = Titkosított | + = Mentett"
STR_MAC_ADDRESS: "MAC-cím:"
STR_CHECKING_WIFI: "Wi-Fi ellenőrzése..."
STR_ENTER_WIFI_PASSWORD: "Add meg a Wi-Fi jelszót"
STR_ADD_HIDDEN_NETWORK: "Rejtett hálózat hozzáadása..."
STR_ENTER_WIFI_SSID: "Add meg a hálózat nevét (SSID)"
STR_TO_PREFIX: "- "
STR_CALIBRE_RECEIVING: "Fogadás: "
STR_CALIBRE_RECEIVED: "Fogadva: "
@@ -301,3 +303,93 @@ STR_SCREENSHOT_BUTTON: "Képernyőkép készítése"
STR_AUTO_TURN_ENABLED: "Automatikus lapozás bekapcsolva: "
STR_AUTO_TURN_PAGES_PER_MIN: "Automatikus lapozás (oldal/perc)"
STR_TILT_PAGE_TURN: "Döntéses lapozás"
STR_ADD_SERVER: "Szerver hozzáadása"
STR_BOOKMARKS: "Könyvjelzők"
STR_BOOKMARK_ADDED: "Könyvjelző hozzáadva."
STR_BOOKMARK_OPTION: "Könyvjelző"
STR_BOTTOM: "Alul"
STR_CLOCK: "Óra"
STR_CLOCK_FORMAT: "Óraformátum"
STR_CLOCK_FORMAT_12H: "12 órás"
STR_CLOCK_FORMAT_24H: "24 órás"
STR_CLOCK_SYNC: "Óra szinkronizálása"
STR_CLOCK_SYNCED: "Óra szinkronizálva"
STR_CLOCK_SYNCING: "Szinkronizálás NTP-ről..."
STR_CLOCK_SYNC_FAIL: "Szinkronizálás sikertelen"
STR_CLOCK_SYNC_NOW: "Óra szinkronizálása most"
STR_CLOCK_SYNC_NO_WIFI: "Wi-Fi nincs csatlakoztatva"
STR_CLOCK_SYNC_NO_WIFI_HINT: "Először csatlakozz Wi-Fi-hez, majd próbáld újra."
STR_CLOCK_SYNC_OK: "Óra szinkronizálva"
STR_CLOCK_UTC_OFFSET: "Óra UTC eltolás"
STR_CONFIRM_DELETE_BOOKMARK: "Törlöd ezt a könyvjelzőt?"
STR_CONNECTING_SAVED_WIFI: "Csatlakozás mentett Wi-Fi-hez..."
STR_CRASH_DESCRIPTION: "A részletes jelentés a crash_report.txt fájlba lett mentve. Kérjük, csatold ezt a fájlt a hibajelentéshez."
STR_CRASH_NO_REASON: "(Nem került rögzítésre ok)"
STR_CRASH_REASON: "Összeomlás oka:"
STR_CRASH_TITLE: "Rendszerösszeomlás"
STR_CURRENT_TIME: "Aktuális idő:"
STR_DELETE_SERVER: "Szerver törlése"
STR_DISABLED: "Letiltva"
STR_DOWNLOAD_ALL: "Összes letöltése"
STR_EOB_CONTINUE_WITH: "Folytatás ezzel"
STR_EOB_HOME: "Kezdőképernyő"
STR_FINDING_SAVED_WIFI: "Mentett Wi-Fi keresése..."
STR_FIRMWARE_FILE_OPEN_FAILED: "A fájl nem nyitható meg"
STR_FIRMWARE_TOO_LARGE: "A firmware túl nagy a partícióhoz"
STR_FIRMWARE_TOO_SMALL: "A firmware fájl túl kicsi"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Ne kapcsold ki!"
STR_FIRMWARE_UPDATE_PROMPT: "Frissíted a firmware-t?"
STR_FIRMWARE_WRITE_FAILED: "A firmware írása sikertelen"
STR_FONT_BROWSER: "Betűtípus-böngésző"
STR_FONT_INSTALLED: "Betűtípus telepítve!"
STR_FONT_INSTALL_FAILED: "A betűtípus telepítése sikertelen"
STR_FORCE_REFRESH: "Képernyő frissítése"
STR_INDEX_FAILED: "Indexelés sikertelen érvénytelen könyv"
STR_INSTALLED: "Telepítve"
STR_INVALID_FIRMWARE: "Érvénytelen firmware fájl"
STR_KB_HINT_CLEAR_TEXT: "Tartsd nyomva a DEL-t az összes szöveg törléséhez"
STR_KB_HINT_EDIT_ENTRY: "Tartsd nyomva a FEL-t a bejegyzés szerkesztéséhez"
STR_KB_HINT_EXIT_URL_MODE: "Nyomd meg az ABC-t az URL mód elhagyásához"
STR_KB_HINT_HIDE_PASSWORD: "Tartsd nyomva a JOBBRA-t, majd nyomd meg a [***]-ot a jelszó elrejtéséhez"
STR_KB_HINT_LOWER_SECONDARY: "Tartsd nyomva a SELECT-et kisbetűért vagy másodlagos karakterért"
STR_KB_HINT_MOVE_CURSOR: "Nyomd meg a BALRA vagy JOBBRA gombot a kurzor mozgatásához"
STR_KB_HINT_RETURN_CURSOR: "Nyomd meg a BALRA-t a kurzorpozícióhoz való visszatéréshez"
STR_KB_HINT_RETURN_KEYBOARD: "Nyomd meg a LE-t a billentyűzethez való visszatéréshez"
STR_KB_HINT_SECONDARY_CHAR: "Tartsd nyomva a SELECT-et másodlagos karakterért"
STR_KB_HINT_SHOW_PASSWORD: "Tartsd nyomva a JOBBRA-t, majd nyomd meg az [abc]-t a jelszó megjelenítéséhez"
STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Nyomd meg a [***]-ot a jelszó elrejtéséhez"
STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Nyomd meg az [abc]-t a jelszó megjelenítéséhez"
STR_KB_HINT_UPPER_SECONDARY: "Tartsd nyomva a SELECT-et NAGYBETŰÉRT vagy másodlagos karakterért"
STR_KB_HINT_URL_SNIPPETS: "Nyomd meg az URL-t az URL-részletekért"
STR_KB_TIPS: "Tippek:"
STR_KOSYNC: "KOSync"
STR_LOADING_FONT_LIST: "Betűtípuslista betöltése..."
STR_LONG_PRESS_BEHAVIOR: "Hosszú gombnyomás viselkedése"
STR_LONG_PRESS_BEHAVIOR_OFF: "KI"
STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Tájolásváltás"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Fejezetugrás"
STR_LONG_PRESS_MENU: "Hosszú nyomás Menü"
STR_MANAGE_FONTS: "Betűtípusok kezelése"
STR_NEXT_FIELD: "Következő"
STR_NEXT_PAGE: "Következő oldal »"
STR_NO_BIN_FILES: "Nincs .bin fájl"
STR_NO_FONTS_AVAILABLE: "Nincs elérhető betűtípus"
STR_NO_SERVERS: "Nincs beállított OPDS szerver"
STR_OPDS_SERVERS: "OPDS szerverek"
STR_PREV_PAGE: "« Előző oldal"
STR_PWR_BTN_FOOTNOTE_BACK: "Gyors visszatérés lábjegyzetből"
STR_RECOVERY_MODE: "Helyreállítási mód"
STR_RECOVERY_MODE_HINT: "Helyezd a firmware.bin fájlt az SD-kártya gyökerébe, majd válaszd ki"
STR_RESTARTING_HINT: "Újraindítás... Ha az eszköz nem indul újra, tartsd nyomva a bekapcsológombot néhány másodpercig."
STR_SD_FIRMWARE_UPDATE: "Firmware frissítés SD-kártyáról"
STR_SEARCH: "Keresés"
STR_SELECT_FIRMWARE_FILE: "Válassz firmware fájlt (.bin)"
STR_SERVER_NAME: "Szerver neve"
STR_SET_SLEEP_COVER: "Borító beállítása"
STR_SHOW_NETWORKS: "Megjelenítés"
STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_TOP: "Felül"
STR_UPDATE_ALL: "Összes frissítése"
STR_UPDATE_AVAILABLE: "Frissítés"
STR_VALIDATING_FIRMWARE: "Firmware ellenőrzése..."
STR_XTC_STATUS_BAR: "XTC állapotsáv"
+2
View File
@@ -387,3 +387,5 @@ STR_PWR_BTN_FOOTNOTE_BACK: "Rientro rapido dalle note"
STR_EOB_CONTINUE_WITH: "Continua con"
STR_EOB_HOME: "Home"
STR_INDEX_FAILED: "Indicizzazione fallita - libro non valido"
STR_ADD_HIDDEN_NETWORK: "Aggiungi rete nascosta..."
STR_ENTER_WIFI_SSID: "Inserisci il nome della rete (SSID)"
+2
View File
@@ -300,3 +300,5 @@ STR_SCREENSHOT_BUTTON: "Скриншот түсіру"
STR_AUTO_TURN_ENABLED: "Автоматты бет аудару қосулы: "
STR_AUTO_TURN_PAGES_PER_MIN: "Автоматты бет аудару (минутына бет саны)"
STR_TILT_PAGE_TURN: "Еңкейту арқылы бет аудару"
STR_ADD_HIDDEN_NETWORK: "Жасырын желіні қосу..."
STR_ENTER_WIFI_SSID: "Желі атауын енгізіңіз (SSID)"
+2
View File
@@ -301,3 +301,5 @@ STR_SCREENSHOT_BUTTON: "Ekrano nuotrauka"
STR_AUTO_TURN_ENABLED: "Auto-vertimas: "
STR_AUTO_TURN_PAGES_PER_MIN: "Auto-vertimas (psl/min)"
STR_TILT_PAGE_TURN: "Puslapio vertimas pakreipiant"
STR_ADD_HIDDEN_NETWORK: "Pridėti paslėptą tinklą..."
STR_ENTER_WIFI_SSID: "Įveskite tinklo pavadinimą (SSID)"
+2
View File
@@ -361,3 +361,5 @@ STR_FIRMWARE_WRITE_FAILED: "Zapis oprogramowania nieudany"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Nie wyłączać!"
STR_RECOVERY_MODE: "Tryb przywracania"
STR_RECOVERY_MODE_HINT: "Umieść firmware.bin w głównym katalogu karty SD i wybierz go"
STR_ADD_HIDDEN_NETWORK: "Dodaj ukrytą sieć..."
STR_ENTER_WIFI_SSID: "Wprowadź nazwę sieci (SSID)"
+2
View File
@@ -384,3 +384,5 @@ STR_FIRMWARE_WRITE_FAILED: "Falha na gravação do firmware"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Não desligue o dispositivo!"
STR_RECOVERY_MODE: "Modo de Recuperação"
STR_RECOVERY_MODE_HINT: "Coloque o arquivo firmware.bin na raiz do cartão SD e selecione-o"
STR_ADD_HIDDEN_NETWORK: "Adicionar rede oculta..."
STR_ENTER_WIFI_SSID: "Insira o nome da rede (SSID)"
+2
View File
@@ -304,3 +304,5 @@ STR_SCREENSHOT_BUTTON: "Captură ecran"
STR_AUTO_TURN_ENABLED: "Răsfoire automată: "
STR_AUTO_TURN_PAGES_PER_MIN: "Pagini pe minut"
STR_TILT_PAGE_TURN: "Întoarcere pagină prin înclinare"
STR_ADD_HIDDEN_NETWORK: "Adaugă rețea ascunsă..."
STR_ENTER_WIFI_SSID: "Introduceți numele rețelei (SSID)"
+2
View File
@@ -384,3 +384,5 @@ STR_FIRMWARE_WRITE_FAILED: "Ошибка записи прошивки"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Не выключайте питание!"
STR_RECOVERY_MODE: "Режим восстановления"
STR_RECOVERY_MODE_HINT: "Поместите firmware.bin в корень SD-карты и выберите его"
STR_ADD_HIDDEN_NETWORK: "Добавить скрытую сеть..."
STR_ENTER_WIFI_SSID: "Введите имя сети (SSID)"
+2
View File
@@ -380,3 +380,5 @@ STR_FIRMWARE_WRITE_FAILED: "Zápis firmvéru zlyhal"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Nevypínajte zariadenie!"
STR_RECOVERY_MODE: "Režim obnovenia"
STR_RECOVERY_MODE_HINT: "Umiestnite firmware.bin do koreňového adresára SD karty a vyberte ho"
STR_ADD_HIDDEN_NETWORK: "Pridať skrytú sieť..."
STR_ENTER_WIFI_SSID: "Zadajte názov siete (SSID)"
+2
View File
@@ -301,3 +301,5 @@ STR_SCREENSHOT_BUTTON: "Naredi posnetek zaslona"
STR_AUTO_TURN_ENABLED: "Samodejno obračanje: "
STR_AUTO_TURN_PAGES_PER_MIN: "Samodejno obračanje (strani na minuto)"
STR_TILT_PAGE_TURN: "Obračanje s priklonom"
STR_ADD_HIDDEN_NETWORK: "Dodaj skrito omrežje..."
STR_ENTER_WIFI_SSID: "Vnesite ime omrežja (SSID)"
+2
View File
@@ -390,3 +390,5 @@ STR_FIRMWARE_WRITE_FAILED: "Falló la escritura del firmware"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "¡No apague el dispositivo!"
STR_RECOVERY_MODE: "Modo de recuperación"
STR_RECOVERY_MODE_HINT: "Ponga firmware.bin en la raíz de la tarj. SD y selecciónelo"
STR_ADD_HIDDEN_NETWORK: "Añadir red oculta..."
STR_ENTER_WIFI_SSID: "Introduce el nombre de la red (SSID)"
+2
View File
@@ -387,3 +387,5 @@ STR_FIRMWARE_WRITE_FAILED: "Skrivning till firmware misslyckades"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Stäng inte av!"
STR_RECOVERY_MODE: "Återställningsläge"
STR_RECOVERY_MODE_HINT: "Placera firmware.bin i SD-kortroten och välj den"
STR_ADD_HIDDEN_NETWORK: "Lägg till dolt nätverk..."
STR_ENTER_WIFI_SSID: "Ange nätverksnamn (SSID)"
+2
View File
@@ -304,3 +304,5 @@ STR_SELECTED: "Seçili"
STR_SHOW: "Göster"
STR_TITLE: "Başlık"
STR_TILT_PAGE_TURN: "Eğerek sayfa çevirme"
STR_ADD_HIDDEN_NETWORK: "Gizli ağ ekle..."
STR_ENTER_WIFI_SSID: "Ağ adını girin (SSID)"
+2
View File
@@ -381,3 +381,5 @@ STR_FIRMWARE_WRITE_FAILED: "Помилка запису прошивки"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Не вимикайте пристрій!"
STR_RECOVERY_MODE: "Режим відновлення"
STR_RECOVERY_MODE_HINT: "Помістіть firmware.bin у корінь SD-карти та виберіть його"
STR_ADD_HIDDEN_NETWORK: "Додати приховану мережу..."
STR_ENTER_WIFI_SSID: "Введіть назву мережі (SSID)"
+2
View File
@@ -390,3 +390,5 @@ STR_FIRMWARE_WRITE_FAILED: "Ha fallat l'escriptura del firmware"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "No apagues el dispositiu!"
STR_RECOVERY_MODE: "Mode de recuperació"
STR_RECOVERY_MODE_HINT: "Posa firmware.bin a l'arrel de la targeta SD i selecciona'l"
STR_ADD_HIDDEN_NETWORK: "Afig una xarxa oculta..."
STR_ENTER_WIFI_SSID: "Introduïx el nom de la xarxa (SSID)"
+2
View File
@@ -380,3 +380,5 @@ STR_FIRMWARE_WRITE_FAILED: "Ghi firmware thất bại"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Không được tắt nguồn!"
STR_RECOVERY_MODE: "Chế độ phục hồi"
STR_RECOVERY_MODE_HINT: "Đặt firmware.bin ở thư mục gốc thẻ SD rồi chọn"
STR_ADD_HIDDEN_NETWORK: "Thêm mạng ẩn..."
STR_ENTER_WIFI_SSID: "Nhập tên mạng (SSID)"
+103 -20
View File
@@ -28,6 +28,7 @@ void WifiSelectionActivity::onEnter() {
// Reset state
selectedNetworkIndex = 0;
networks.clear();
realNetworkCount = 0;
state = WifiSelectionState::SCANNING;
selectedSSID.clear();
connectedIP.clear();
@@ -114,9 +115,13 @@ void WifiSelectionActivity::processWifiScanResults() {
}
if (scanResult == WIFI_SCAN_FAILED) {
networks.clear();
realNetworkCount = 0;
appendHiddenNetworkEntry();
autoConnecting = false;
manualNetworkListRequested = false;
state = WifiSelectionState::NETWORK_LIST;
selectedNetworkIndex = 0;
requestUpdate();
return;
}
@@ -158,6 +163,9 @@ void WifiSelectionActivity::processWifiScanResults() {
return a.rssi > b.rssi;
});
realNetworkCount = networks.size();
appendHiddenNetworkEntry();
WiFi.scanDelete();
if (autoConnecting && !manualNetworkListRequested && tryNextSavedNetworkFromScan()) {
@@ -171,12 +179,30 @@ void WifiSelectionActivity::processWifiScanResults() {
requestUpdate();
}
void WifiSelectionActivity::appendHiddenNetworkEntry() {
// Synthetic list entry that lets the user type an SSID that is not broadcast.
// ESP32 can join hidden APs as long as the SSID is supplied to WiFi.begin().
WifiNetworkInfo placeholder;
placeholder.rssi = 0;
placeholder.isEncrypted = true; // Treated as encrypted; an empty password still connects open APs
placeholder.hasSavedPassword = false;
placeholder.isHiddenPlaceholder = true;
networks.push_back(std::move(placeholder));
}
void WifiSelectionActivity::selectNetwork(const int index) {
if (index < 0 || index >= static_cast<int>(networks.size())) {
return;
}
const auto& network = networks[index];
// Synthetic "Add hidden network..." entry: prompt the user to type the SSID first
if (network.isHiddenPlaceholder) {
promptHiddenSsid();
return;
}
selectedSSID = network.ssid;
selectedRequiresPassword = network.isEncrypted;
usedSavedPassword = false;
@@ -195,27 +221,57 @@ void WifiSelectionActivity::selectNetwork(const int index) {
}
if (selectedRequiresPassword) {
// Show password entry
state = WifiSelectionState::PASSWORD_ENTRY;
// Don't allow screen updates while changing activity
startActivityForResult(std::make_unique<KeyboardEntryActivity>(renderer, mappedInput, tr(STR_ENTER_WIFI_PASSWORD),
"", // No initial text
64, // Max password length
InputType::Password),
[this](const ActivityResult& result) {
if (result.isCancelled) {
state = WifiSelectionState::NETWORK_LIST;
} else {
enteredPassword = std::get<KeyboardResult>(result.data).text;
// state will be updated in next loop iteration
}
});
promptPasswordEntry();
} else {
// Connect directly for open networks
attemptConnection();
}
}
void WifiSelectionActivity::promptPasswordEntry() {
// Show password entry
state = WifiSelectionState::PASSWORD_ENTRY;
// Don't allow screen updates while changing activity
startActivityForResult(std::make_unique<KeyboardEntryActivity>(renderer, mappedInput, tr(STR_ENTER_WIFI_PASSWORD),
"", // No initial text
64, // Max password length
InputType::Password),
[this](const ActivityResult& result) {
if (result.isCancelled) {
state = WifiSelectionState::NETWORK_LIST;
} else {
enteredPassword = std::get<KeyboardResult>(result.data).text;
// state will be updated in next loop iteration
}
});
}
void WifiSelectionActivity::promptHiddenSsid() {
selectedSSID.clear();
selectedRequiresPassword = true; // Hidden networks are usually encrypted; empty password still joins open APs
usedSavedPassword = false;
enteredPassword.clear();
autoConnecting = false;
// Suppress rendering during the activity transition (see render()).
state = WifiSelectionState::HIDDEN_SSID_ENTRY;
startActivityForResult(std::make_unique<KeyboardEntryActivity>(renderer, mappedInput, tr(STR_ENTER_WIFI_SSID),
"", // No initial text
32, // Max SSID length (IEEE 802.11: 32 bytes)
InputType::Text),
[this](const ActivityResult& result) {
if (result.isCancelled) {
state = WifiSelectionState::NETWORK_LIST;
return;
}
selectedSSID = std::get<KeyboardResult>(result.data).text;
if (selectedSSID.empty()) {
state = WifiSelectionState::NETWORK_LIST;
}
// Otherwise stay in HIDDEN_SSID_ENTRY; loop() continues the flow.
});
}
bool WifiSelectionActivity::hasAttemptedAutoSsid(const std::string& ssid) const {
return std::find(autoAttemptedSsids.begin(), autoAttemptedSsids.end(), ssid) != autoAttemptedSsids.end();
}
@@ -422,6 +478,22 @@ void WifiSelectionActivity::loop() {
return;
}
// Reached once the hidden-network SSID has been entered (and was non-empty).
if (state == WifiSelectionState::HIDDEN_SSID_ENTRY) {
const auto* savedCred = WIFI_STORE.findCredential(selectedSSID);
if (savedCred && !savedCred->password.empty()) {
// We already know this hidden network - connect with the saved password
enteredPassword = savedCred->password;
usedSavedPassword = true;
LOG_DBG("WiFi", "Using saved password for hidden network %s", selectedSSID.c_str());
attemptConnection();
} else {
// Prompt for the password (empty password connects to open hidden APs)
promptPasswordEntry();
}
return;
}
if (state == WifiSelectionState::PASSWORD_ENTRY) {
// Reach here once password entry finished in subactivity
attemptConnection();
@@ -582,9 +654,9 @@ std::string WifiSelectionActivity::getSignalStrengthIndicator(const int32_t rssi
}
void WifiSelectionActivity::render(RenderLock&&) {
// Don't render if we're in PASSWORD_ENTRY state - we're just transitioning
// Don't render if we're in a keyboard-entry state - we're just transitioning
// from the keyboard subactivity back to the main activity
if (state == WifiSelectionState::PASSWORD_ENTRY) {
if (state == WifiSelectionState::PASSWORD_ENTRY || state == WifiSelectionState::HIDDEN_SSID_ENTRY) {
return;
}
@@ -596,7 +668,7 @@ void WifiSelectionActivity::render(RenderLock&&) {
// Draw header
char countStr[32];
snprintf(countStr, sizeof(countStr), tr(STR_NETWORKS_FOUND), networks.size());
snprintf(countStr, sizeof(countStr), tr(STR_NETWORKS_FOUND), realNetworkCount);
GUI.drawHeader(renderer, Rect{screen.x, screen.y + metrics.topPadding, screen.width, metrics.headerHeight},
tr(STR_WIFI_NETWORKS), countStr);
GUI.drawSubHeader(
@@ -614,6 +686,9 @@ void WifiSelectionActivity::render(RenderLock&&) {
case WifiSelectionState::NETWORK_LIST:
renderNetworkList(&screen, &metrics);
break;
case WifiSelectionState::HIDDEN_SSID_ENTRY:
// Transitioning to/from the SSID keyboard subactivity - nothing to draw
break;
case WifiSelectionState::CONNECTING:
renderConnecting(&screen, &metrics);
break;
@@ -647,9 +722,17 @@ void WifiSelectionActivity::renderNetworkList(const Rect* screen, const ThemeMet
int contentHeight = screen->height - contentTop - metrics->verticalSpacing * 2;
GUI.drawList(
renderer, Rect{screen->x, contentTop, screen->width, contentHeight}, static_cast<int>(networks.size()),
selectedNetworkIndex, [this](int index) { return networks[index].ssid; }, nullptr, nullptr,
selectedNetworkIndex,
[this](int index) {
auto network = networks[index];
const auto& network = networks[index];
return network.isHiddenPlaceholder ? std::string(tr(STR_ADD_HIDDEN_NETWORK)) : network.ssid;
},
nullptr, nullptr,
[this](int index) {
const auto& network = networks[index];
if (network.isHiddenPlaceholder) {
return std::string();
}
return std::string(network.hasSavedPassword ? "+ " : "") + (network.isEncrypted ? "* " : "") +
getSignalStrengthIndicator(network.rssi);
});
@@ -18,7 +18,8 @@ struct WifiNetworkInfo {
std::string ssid;
int32_t rssi;
bool isEncrypted;
bool hasSavedPassword; // Whether we have saved credentials for this network
bool hasSavedPassword; // Whether we have saved credentials for this network
bool isHiddenPlaceholder = false; // Synthetic "Add hidden network..." list entry
};
// WiFi selection states
@@ -26,6 +27,7 @@ enum class WifiSelectionState {
AUTO_CONNECTING, // Trying to connect to the last known network
SCANNING, // Scanning for networks
NETWORK_LIST, // Displaying available networks
HIDDEN_SSID_ENTRY, // Entering SSID for a hidden network
PASSWORD_ENTRY, // Entering password for selected network
CONNECTING, // Attempting to connect
CONNECTED, // Successfully connected
@@ -51,6 +53,8 @@ class WifiSelectionActivity final : public Activity {
WifiSelectionState state = WifiSelectionState::SCANNING;
size_t selectedNetworkIndex = 0;
std::vector<WifiNetworkInfo> networks;
// Number of real (scanned) networks, excluding the synthetic hidden-network entry
size_t realNetworkCount = 0;
// Selected network for connection
std::string selectedSSID;
@@ -100,7 +104,10 @@ class WifiSelectionActivity final : public Activity {
void startWifiScan(bool autoScan = false);
void processWifiScanResults();
void appendHiddenNetworkEntry();
void selectNetwork(int index);
void promptHiddenSsid();
void promptPasswordEntry();
void attemptConnection();
void checkConnectionStatus();
bool tryAutoConnectCredential(const WifiCredential& cred);