diff --git a/Sources/App/Resources/bg.lproj/Localizable.strings b/Sources/App/Resources/bg.lproj/Localizable.strings index 5e3f53edd..f2c5f1899 100644 --- a/Sources/App/Resources/bg.lproj/Localizable.strings +++ b/Sources/App/Resources/bg.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/ca-ES.lproj/Localizable.strings b/Sources/App/Resources/ca-ES.lproj/Localizable.strings index 4a057d519..b2ecf4855 100644 --- a/Sources/App/Resources/ca-ES.lproj/Localizable.strings +++ b/Sources/App/Resources/ca-ES.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/cs.lproj/Localizable.strings b/Sources/App/Resources/cs.lproj/Localizable.strings index 79f18e2bc..d49582249 100644 --- a/Sources/App/Resources/cs.lproj/Localizable.strings +++ b/Sources/App/Resources/cs.lproj/Localizable.strings @@ -507,11 +507,8 @@ Tento server vyžaduje klientský certifikát (mTLS), ale operace byla zrušena. "live_activity.end_all.button" = "Ukončit všechny aktivity"; "live_activity.end_all.confirm.button" = "Ukončit vše"; "live_activity.end_all.confirm.title" = "Ukončit všechny živé aktivity?"; -"live_activity.frequent_updates.footer" = "Umožňuje Home Assistantovi aktualizovat živé aktivity až jednou za sekundu. Povolte v Nastavení. \u203A %@ \u203A Živé aktivity."; "live_activity.frequent_updates.title" = "Časté aktualizace"; -"live_activity.privacy.message" = "Obsah živých aktivit je viditelný na zamykací obrazovce a v Dynamic Islandu bez použití Face ID nebo Touch ID. Pečlivě si vyberte, co chcete zobrazit."; "live_activity.section.active" = "Aktivní aktivity"; -"live_activity.section.privacy" = "Soukromí"; "live_activity.section.status" = "Stav"; "live_activity.status.enabled" = "Povoleno"; "live_activity.status.not_supported" = "Není dostupné na iPadu"; diff --git a/Sources/App/Resources/cy-GB.lproj/Localizable.strings b/Sources/App/Resources/cy-GB.lproj/Localizable.strings index 6305bbb2c..6a4d0a164 100644 --- a/Sources/App/Resources/cy-GB.lproj/Localizable.strings +++ b/Sources/App/Resources/cy-GB.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/da.lproj/Localizable.strings b/Sources/App/Resources/da.lproj/Localizable.strings index e30d9958f..f7fe9b080 100644 --- a/Sources/App/Resources/da.lproj/Localizable.strings +++ b/Sources/App/Resources/da.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "Afslut alle aktiviteter"; "live_activity.end_all.confirm.button" = "Afslut alle"; "live_activity.end_all.confirm.title" = "Afslut alle liveaktiviteter?"; -"live_activity.frequent_updates.footer" = "Tillader Home Assistant at opdatere Liveaktiviteter op til én gang i sekundet. Aktivér i Indstillinger \u203A %@ \u203A Liveaktiviteter."; "live_activity.frequent_updates.title" = "Hyppige opdateringer"; -"live_activity.privacy.message" = "Liveaktivitet-indhold er synligt på din låseskærm og Dynamic Island uden Face ID eller Touch ID. Vælg omhyggeligt, hvad du vil vise."; "live_activity.section.active" = "Aktive aktiviteter"; -"live_activity.section.privacy" = "Privatliv"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Aktiveret"; "live_activity.status.not_supported" = "Ikke tilgængelig på iPad"; diff --git a/Sources/App/Resources/de.lproj/Localizable.strings b/Sources/App/Resources/de.lproj/Localizable.strings index 147b5c2f6..02556d2d5 100644 --- a/Sources/App/Resources/de.lproj/Localizable.strings +++ b/Sources/App/Resources/de.lproj/Localizable.strings @@ -507,11 +507,8 @@ Dieser Server benötigt ein Clientzertifikat (mTLS), aber der Vorgang wurde abge "live_activity.end_all.button" = "Alle Aktivitäten beenden"; "live_activity.end_all.confirm.button" = "Alle beenden"; "live_activity.end_all.confirm.title" = "Alle Live-Aktivitäten beenden?"; -"live_activity.frequent_updates.footer" = "Ermöglicht es Home Assistant, Live-Aktivitäten bis zu einmal pro Sekunde zu aktualisieren. In Einstellungen \u203A %@ \u203A Live-Aktivitäten aktiveren."; "live_activity.frequent_updates.title" = "Häufige Aktualisierungen"; -"live_activity.privacy.message" = "Inhalte für Live-Aktivität sind auf deinem Sperrbildschirm und Dynamic Island auch ohne Face ID oder Touch ID sichtbar. Wähle die angezeigten Inhalte sorgfältig aus."; "live_activity.section.active" = "Aktive Aktivitäten"; -"live_activity.section.privacy" = "Datenschutz"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Aktiviert"; "live_activity.status.not_supported" = "Auf dem iPad nicht verfügbar"; diff --git a/Sources/App/Resources/el.lproj/Localizable.strings b/Sources/App/Resources/el.lproj/Localizable.strings index 86bf2efbb..773f48523 100644 --- a/Sources/App/Resources/el.lproj/Localizable.strings +++ b/Sources/App/Resources/el.lproj/Localizable.strings @@ -507,11 +507,8 @@ "live_activity.end_all.button" = "Τερματισμός όλων των δραστηριοτήτων"; "live_activity.end_all.confirm.button" = "Τερματισμός όλων"; "live_activity.end_all.confirm.title" = "Τερματισμός όλων των ζωντανών δραστηριοτήτων;"; -"live_activity.frequent_updates.footer" = "Επιτρέπει στο Home Assistant να ενημερώνει τις Ζωντανές Δραστηριότητες έως και μία φορά ανά δευτερόλεπτο. Ενεργοποίηση στις Ρυθμίσεις \u203A %@ \u203A Ζωντανές Δραστηριότητες."; "live_activity.frequent_updates.title" = "Συχνές ενημερώσεις"; -"live_activity.privacy.message" = "Το περιεχόμενο της Ζωντανής Δραστηριότητας είναι ορατό στην Οθόνη Κλειδώματος και στο Dynamic Island χωρίς Face ID ή Touch ID. Επιλέξτε προσεκτικά τι θα εμφανίσετε."; "live_activity.section.active" = "Ενεργές δραστηριότητες"; -"live_activity.section.privacy" = "Απόρρητο"; "live_activity.section.status" = "Κατάσταση"; "live_activity.status.enabled" = "Ενεργό"; "live_activity.status.not_supported" = "Δεν είναι διαθέσιμο σε iPad"; diff --git a/Sources/App/Resources/en-GB.lproj/Localizable.strings b/Sources/App/Resources/en-GB.lproj/Localizable.strings index d6b40751c..a112565d8 100644 --- a/Sources/App/Resources/en-GB.lproj/Localizable.strings +++ b/Sources/App/Resources/en-GB.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/en.lproj/Localizable.strings b/Sources/App/Resources/en.lproj/Localizable.strings index 59d003f46..af33d2308 100644 --- a/Sources/App/Resources/en.lproj/Localizable.strings +++ b/Sources/App/Resources/en.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/es-ES.lproj/Localizable.strings b/Sources/App/Resources/es-ES.lproj/Localizable.strings index f4c3b6eec..43ede1629 100644 --- a/Sources/App/Resources/es-ES.lproj/Localizable.strings +++ b/Sources/App/Resources/es-ES.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/es-MX.lproj/Localizable.strings b/Sources/App/Resources/es-MX.lproj/Localizable.strings index 0a8d5de33..0a841bb85 100644 --- a/Sources/App/Resources/es-MX.lproj/Localizable.strings +++ b/Sources/App/Resources/es-MX.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/es.lproj/Localizable.strings b/Sources/App/Resources/es.lproj/Localizable.strings index d5ef25663..bec18a5ba 100644 --- a/Sources/App/Resources/es.lproj/Localizable.strings +++ b/Sources/App/Resources/es.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/et.lproj/Localizable.strings b/Sources/App/Resources/et.lproj/Localizable.strings index 2811c2e6b..36412cc12 100644 --- a/Sources/App/Resources/et.lproj/Localizable.strings +++ b/Sources/App/Resources/et.lproj/Localizable.strings @@ -507,11 +507,8 @@ "live_activity.end_all.button" = "Lõpeta kõik tegevused"; "live_activity.end_all.confirm.button" = "Lõpeta kõik"; "live_activity.end_all.confirm.title" = "Kas lõpetada kõik Live Activity tegevused?"; -"live_activity.frequent_updates.footer" = "Lubab Home Assistantil reaalajas tegevusi kuni üks kord sekundis värskendada. Luba seadetes. \u203A %@ \u203A Otseülekanded."; "live_activity.frequent_updates.title" = "Sagedased uuendused"; -"live_activity.privacy.message" = "Live Activity sisu on nähtav lukustusekraanil ja dünaamilisel saarel ilma Face ID või Touch ID-ta. Vali hoolikalt, mida kuvada."; "live_activity.section.active" = "Aktiivsed tegevused"; -"live_activity.section.privacy" = "Privaatsus"; "live_activity.section.status" = "Olek"; "live_activity.status.enabled" = "Lubatud"; "live_activity.status.not_supported" = "Pole iPadis saadaval"; diff --git a/Sources/App/Resources/fi.lproj/Localizable.strings b/Sources/App/Resources/fi.lproj/Localizable.strings index 5a13b632e..be83fcea7 100644 --- a/Sources/App/Resources/fi.lproj/Localizable.strings +++ b/Sources/App/Resources/fi.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/fr.lproj/Localizable.strings b/Sources/App/Resources/fr.lproj/Localizable.strings index 60c10fe18..5151a88c5 100644 --- a/Sources/App/Resources/fr.lproj/Localizable.strings +++ b/Sources/App/Resources/fr.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/he.lproj/Localizable.strings b/Sources/App/Resources/he.lproj/Localizable.strings index 968b6b258..4d2bce18c 100644 --- a/Sources/App/Resources/he.lproj/Localizable.strings +++ b/Sources/App/Resources/he.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/hu.lproj/Localizable.strings b/Sources/App/Resources/hu.lproj/Localizable.strings index 1e651da99..e0959db94 100644 --- a/Sources/App/Resources/hu.lproj/Localizable.strings +++ b/Sources/App/Resources/hu.lproj/Localizable.strings @@ -507,11 +507,8 @@ Ez a szerver kliens tanúsítványt (mTLS) igényel, de a művelet megszakítva. "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/id.lproj/Localizable.strings b/Sources/App/Resources/id.lproj/Localizable.strings index 9c424ba70..458d9ba7c 100644 --- a/Sources/App/Resources/id.lproj/Localizable.strings +++ b/Sources/App/Resources/id.lproj/Localizable.strings @@ -507,11 +507,8 @@ Server ini memerlukan sertifikat klien (mTLS) tetapi operasi dibatalkan."; "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/it.lproj/Localizable.strings b/Sources/App/Resources/it.lproj/Localizable.strings index afe69868b..90f7b8a8b 100644 --- a/Sources/App/Resources/it.lproj/Localizable.strings +++ b/Sources/App/Resources/it.lproj/Localizable.strings @@ -507,11 +507,8 @@ Questo server richiede un certificato client (mTLS), ma l'operazione è stata an "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Consente a Home Assistant di aggiornare le Live Activity fino a una volta al secondo. Attiva nelle Impostazioni \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/ja.lproj/Localizable.strings b/Sources/App/Resources/ja.lproj/Localizable.strings index 8b6dc41c9..18a594847 100644 --- a/Sources/App/Resources/ja.lproj/Localizable.strings +++ b/Sources/App/Resources/ja.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/ko-KR.lproj/Localizable.strings b/Sources/App/Resources/ko-KR.lproj/Localizable.strings index fe36a7782..0aee9e0b6 100644 --- a/Sources/App/Resources/ko-KR.lproj/Localizable.strings +++ b/Sources/App/Resources/ko-KR.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/ml.lproj/Localizable.strings b/Sources/App/Resources/ml.lproj/Localizable.strings index e309c75b1..433619071 100644 --- a/Sources/App/Resources/ml.lproj/Localizable.strings +++ b/Sources/App/Resources/ml.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/nb.lproj/Localizable.strings b/Sources/App/Resources/nb.lproj/Localizable.strings index a326f221e..ef41d064f 100644 --- a/Sources/App/Resources/nb.lproj/Localizable.strings +++ b/Sources/App/Resources/nb.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Lar Home Assistant oppdatere Live Activities opptil én gang per sekund. Aktiver i Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Hyppige oppdateringer"; -"live_activity.privacy.message" = "Live Activity-innhold er synlig på låseskjermen og Dynamic Island uten Face ID eller Touch ID. Vær nøye med hva du viser."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/nl.lproj/Localizable.strings b/Sources/App/Resources/nl.lproj/Localizable.strings index 88296eddd..594656a05 100644 --- a/Sources/App/Resources/nl.lproj/Localizable.strings +++ b/Sources/App/Resources/nl.lproj/Localizable.strings @@ -507,11 +507,8 @@ Deze server vereist een clientcertificaat (mTLS), maar de bewerking is geannulee "live_activity.end_all.button" = "Alle activiteiten beëindigen"; "live_activity.end_all.confirm.button" = "Alles beëindigen"; "live_activity.end_all.confirm.title" = "Alle live activiteiten beëindigen?"; -"live_activity.frequent_updates.footer" = "Hiermee kan Home Assistant Live Activiteiten tot één keer per seconde bijwerken. Schakel dit in via Instellingen \u203A %@ \u203A Live activiteiten."; "live_activity.frequent_updates.title" = "Regelmatig bijwerken"; -"live_activity.privacy.message" = "Live activiteit-inhoud is zichtbaar op je vergrendelscherm en Dynamic Island zonder Face ID of Touch ID. Bedenk goed wat je wilt laten zien."; "live_activity.section.active" = "Actieve activiteiten"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Ingeschakeld"; "live_activity.status.not_supported" = "Niet beschikbaar op iPad"; diff --git a/Sources/App/Resources/pl-PL.lproj/Localizable.strings b/Sources/App/Resources/pl-PL.lproj/Localizable.strings index 960f88a4d..38fbaf986 100644 --- a/Sources/App/Resources/pl-PL.lproj/Localizable.strings +++ b/Sources/App/Resources/pl-PL.lproj/Localizable.strings @@ -507,11 +507,8 @@ "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/pt-BR.lproj/Localizable.strings b/Sources/App/Resources/pt-BR.lproj/Localizable.strings index 6bebe5dbf..b324cb453 100644 --- a/Sources/App/Resources/pt-BR.lproj/Localizable.strings +++ b/Sources/App/Resources/pt-BR.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/ru.lproj/Localizable.strings b/Sources/App/Resources/ru.lproj/Localizable.strings index 386ae67ca..2013674d0 100644 --- a/Sources/App/Resources/ru.lproj/Localizable.strings +++ b/Sources/App/Resources/ru.lproj/Localizable.strings @@ -507,11 +507,8 @@ "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/sl.lproj/Localizable.strings b/Sources/App/Resources/sl.lproj/Localizable.strings index 7b0333058..e36a5db89 100644 --- a/Sources/App/Resources/sl.lproj/Localizable.strings +++ b/Sources/App/Resources/sl.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/sv.lproj/Localizable.strings b/Sources/App/Resources/sv.lproj/Localizable.strings index 103a6dca2..64584e1dc 100644 --- a/Sources/App/Resources/sv.lproj/Localizable.strings +++ b/Sources/App/Resources/sv.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/tr.lproj/Localizable.strings b/Sources/App/Resources/tr.lproj/Localizable.strings index e407a56b9..74dbaa43b 100644 --- a/Sources/App/Resources/tr.lproj/Localizable.strings +++ b/Sources/App/Resources/tr.lproj/Localizable.strings @@ -507,11 +507,8 @@ "live_activity.end_all.button" = "Tüm Etkinlikleri Sonlandır"; "live_activity.end_all.confirm.button" = "Tümünü Sonlandır"; "live_activity.end_all.confirm.title" = "Tüm canlı etkinlikleri sonlandırılsın mı?"; -"live_activity.frequent_updates.footer" = "Home Assistant'ın Canlı Etkinlikleri saniyede bir kez güncellemesine olanak tanır. Ayarlar'dan etkinleştirin. \u203A %@ \u203A Canlı Etkinlikler."; "live_activity.frequent_updates.title" = "Sık Güncellemeler"; -"live_activity.privacy.message" = "Canlı Etkinlik içeriği, Face ID veya Touch ID olmadan da Kilit Ekranınızda ve Dinamik Ada'da görünür. Ne göstereceğinizi dikkatlice seçin."; "live_activity.section.active" = "Aktif Etkinlikler"; -"live_activity.section.privacy" = "Gizlilik"; "live_activity.section.status" = "Durum"; "live_activity.status.enabled" = "Etkin"; "live_activity.status.not_supported" = "iPad'de mevcut değil"; diff --git a/Sources/App/Resources/uk.lproj/Localizable.strings b/Sources/App/Resources/uk.lproj/Localizable.strings index e7ff95e18..8a5c89271 100644 --- a/Sources/App/Resources/uk.lproj/Localizable.strings +++ b/Sources/App/Resources/uk.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/vi.lproj/Localizable.strings b/Sources/App/Resources/vi.lproj/Localizable.strings index 1a7f84c0e..0d977b2b4 100644 --- a/Sources/App/Resources/vi.lproj/Localizable.strings +++ b/Sources/App/Resources/vi.lproj/Localizable.strings @@ -507,11 +507,8 @@ This server requires a client certificate (mTLS) but the operation was cancelled "live_activity.end_all.button" = "End All Activities"; "live_activity.end_all.confirm.button" = "End All"; "live_activity.end_all.confirm.title" = "End all Live Activities?"; -"live_activity.frequent_updates.footer" = "Allows Home Assistant to update Live Activities up to once per second. Enable in Settings \u203A %@ \u203A Live Activities."; "live_activity.frequent_updates.title" = "Frequent Updates"; -"live_activity.privacy.message" = "Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully."; "live_activity.section.active" = "Active Activities"; -"live_activity.section.privacy" = "Privacy"; "live_activity.section.status" = "Status"; "live_activity.status.enabled" = "Enabled"; "live_activity.status.not_supported" = "Not available on iPad"; diff --git a/Sources/App/Resources/zh-Hans.lproj/Localizable.strings b/Sources/App/Resources/zh-Hans.lproj/Localizable.strings index b6e16ea32..058bc5d8a 100644 --- a/Sources/App/Resources/zh-Hans.lproj/Localizable.strings +++ b/Sources/App/Resources/zh-Hans.lproj/Localizable.strings @@ -507,11 +507,8 @@ "live_activity.end_all.button" = "结束所有活动"; "live_activity.end_all.confirm.button" = "全部结束"; "live_activity.end_all.confirm.title" = "结束所有实时活动吗 ?"; -"live_activity.frequent_updates.footer" = "允许 Home Assistant 每秒更新一次实时活动。在“设置” \u203A %@ \u203A “实时活动”中启用。"; "live_activity.frequent_updates.title" = "频繁更新"; -"live_activity.privacy.message" = "即使没有面容 ID 或触控 ID,您也可以在锁定屏幕和动态岛屿上查看实时活动内容。请谨慎选择要显示的内容。"; "live_activity.section.active" = "活跃活动"; -"live_activity.section.privacy" = "隐私"; "live_activity.section.status" = "状况"; "live_activity.status.enabled" = "已启用"; "live_activity.status.not_supported" = "iPad 版暂不可用"; diff --git a/Sources/App/Resources/zh-Hant.lproj/Localizable.strings b/Sources/App/Resources/zh-Hant.lproj/Localizable.strings index ec2148c75..3a7001610 100644 --- a/Sources/App/Resources/zh-Hant.lproj/Localizable.strings +++ b/Sources/App/Resources/zh-Hant.lproj/Localizable.strings @@ -507,11 +507,8 @@ "live_activity.end_all.button" = "結束所有即時動態"; "live_activity.end_all.confirm.button" = "全部結束"; "live_activity.end_all.confirm.title" = "結束所有即時動態?"; -"live_activity.frequent_updates.footer" = "允許 Home Assistant 每秒更新一次即時動態。於設定中開啟 \u203A %@ \u203A 即時動態。"; "live_activity.frequent_updates.title" = "頻繁更新"; -"live_activity.privacy.message" = "即使沒有 Face ID 或 Touch ID,也可以在鎖定畫面和動態島上查看即時動態內容。請謹慎選擇要顯示的內容。"; "live_activity.section.active" = "啟用動態"; -"live_activity.section.privacy" = "隱私權"; "live_activity.section.status" = "狀態"; "live_activity.status.enabled" = "已開啟"; "live_activity.status.not_supported" = "iPad 版暫不可用"; diff --git a/Sources/App/Settings/DebugView.swift b/Sources/App/Settings/DebugView.swift index b0f8df1cd..f20b80e1f 100644 --- a/Sources/App/Settings/DebugView.swift +++ b/Sources/App/Settings/DebugView.swift @@ -145,21 +145,6 @@ struct DebugView: View { #endif } - #if os(iOS) && !targetEnvironment(macCatalyst) - if #available(iOS 17.2, *) { - Section { - NavigationLink { - LiveActivitySettingsView() - } label: { - linkContent( - image: .init(systemSymbol: .livephoto), - title: L10n.LiveActivity.title - ) - } - } - } - #endif - criticalSection if tapsOnCasitaLogo < 10 { diff --git a/Sources/App/Settings/LiveActivity/LiveActivitySettingsView.swift b/Sources/App/Settings/LiveActivity/LiveActivitySettingsView.swift index 97be42038..29c3f6e8f 100644 --- a/Sources/App/Settings/LiveActivity/LiveActivitySettingsView.swift +++ b/Sources/App/Settings/LiveActivity/LiveActivitySettingsView.swift @@ -6,7 +6,7 @@ import SwiftUI // MARK: - Entry point /// Deployment target is iOS 15. The settings item is filtered from the list on < iOS 17.2 -/// (see SettingsItem.allVisibleCases), so this view is only ever navigated to on iOS 17.2+. +/// (see SettingsItem.generalItems/allVisibleCases), so this view is only ever navigated to on iOS 17.2+. @available(iOS 17.2, *) struct LiveActivitySettingsView: View { // MARK: State @@ -63,14 +63,8 @@ struct LiveActivitySettingsView: View { } #if DEBUG - debugSection + samplesSection #endif - - privacySection - - if #available(iOS 17.2, *) { - frequentUpdatesSection - } } .navigationTitle(L10n.LiveActivity.title) .task { await loadActivities() } @@ -79,30 +73,56 @@ struct LiveActivitySettingsView: View { // MARK: - Sections private var statusSection: some View { - Section(L10n.LiveActivity.Section.status) { + Section { HStack { Label(L10n.LiveActivity.title, systemSymbol: .livephoto) Spacer() - if authorizationEnabled { + if !isLiveActivitySupportedOnDevice { + Text(L10n.LiveActivity.Status.notSupported) + .foregroundStyle(.secondary) + } else if authorizationEnabled { Text(L10n.LiveActivity.Status.enabled) .foregroundStyle(.green) - } else if UIDevice.current.userInterfaceIdiom == .pad { + } else { + Button(L10n.LiveActivity.Status.openSettings) { + if let url = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(url) + } + } + .foregroundStyle(.orange) + } + } + + HStack { + Label(L10n.LiveActivity.FrequentUpdates.title, systemSymbol: .bolt) + Spacer() + if !isLiveActivitySupportedOnDevice { Text(L10n.LiveActivity.Status.notSupported) .foregroundStyle(.secondary) + } else if frequentUpdatesEnabled { + Text(L10n.LiveActivity.Status.enabled) + .foregroundStyle(.green) } else { Button(L10n.LiveActivity.Status.openSettings) { if let url = URL(string: UIApplication.openSettingsURLString) { UIApplication.shared.open(url) } } - .foregroundStyle(.orange) + .foregroundStyle(.secondary) } } + } header: { + Text(L10n.LiveActivity.Section.status) } } - // MARK: - Debug (DEBUG builds only) + private var isLiveActivitySupportedOnDevice: Bool { + UIDevice.current.userInterfaceIdiom != .pad + } + + // MARK: - Samples (DEBUG builds only) + #if DEBUG // // Two sections: Static (fixed snapshots to verify layout) and Animated (multi-stage // self-updating sequences to simulate real HA automation behavior). @@ -121,131 +141,139 @@ struct LiveActivitySettingsView: View { // It does NOT appear on the lock screen. Use a Dynamic Island device or // simulator (iPhone 14 Pro+) to see it. - #if DEBUG - private var debugSection: some View { - Group { - Section { - // Minimum viable layout — only the message field is set. - // Verifies the bare layout renders without icon, progress, or timer. - Button("Plain Message") { - startTestActivity( - tag: "debug-plain", - title: "Home Assistant", - state: .init(message: "Everything looks good at home.") - ) + private var samplesSection: some View { + Section { + NavigationLink("Samples") { + List { + staticSamplesSection + animatedSamplesSection } + .navigationTitle("Samples") + } + } + } - // icon = nil code path. Layout must not shift or break when no icon is provided. - // color = nil so the progress bar uses the default HA-blue tint. - // criticalText ("Active") visible in DI compact trailing only. - Button("No Icon · Default Color") { - startTestActivity( - tag: "debug-no-icon", - title: "Script Running", - state: .init( - message: "Irrigation zone 3 is active", - criticalText: "Active", - progress: 35, - progressMax: 100 - ) - ) - } + private var staticSamplesSection: some View { + Section { + // Minimum viable layout — only the message field is set. + // Verifies the bare layout renders without icon, progress, or timer. + Button("Plain Message") { + startTestActivity( + tag: "debug-plain", + title: "Home Assistant", + state: .init(message: "Everything looks good at home.") + ) + } - // Short 60-second countdown with no progress bar. - // Red color communicates urgency. Watch the timer count down in real time. - // Represents automations like alarm arming delays or reminder countdowns. - Button("Alarm · 60 sec Countdown") { - startTestActivity( - tag: "debug-alarm", - title: "Security Alarm", - state: .init( - message: "Motion at back door · Arms in 60 seconds", - criticalText: "60 sec", - chronometer: true, - countdownEnd: Date().addingTimeInterval(60), - icon: "mdi:alarm-light", - color: "#F44336" - ) + // icon = nil code path. Layout must not shift or break when no icon is provided. + // color = nil so the progress bar uses the default HA-blue tint. + // criticalText ("Active") visible in DI compact trailing only. + Button("No Icon · Default Color") { + startTestActivity( + tag: "debug-no-icon", + title: "Script Running", + state: .init( + message: "Irrigation zone 3 is active", + criticalText: "Active", + progress: 35, + progressMax: 100 ) - } + ) + } - // Every ContentState field active at the same time. - // Lock screen shows: icon → live countdown → progress bar. - // criticalText ("5 min") visible in DI compact trailing only. - // Use this to confirm no layout collisions when all fields are populated. - Button("All Fields · Max Load") { - startTestActivity( - tag: "debug-all", - title: "All Fields", - state: .init( - message: "All content state fields active", - criticalText: "5 min", - progress: 42, - progressMax: 100, - chronometer: true, - countdownEnd: Date().addingTimeInterval(5 * 60), - icon: "mdi:home-assistant", - color: "#03A9F4" - ) + // Short 60-second countdown with no progress bar. + // Red color communicates urgency. Watch the timer count down in real time. + // Represents automations like alarm arming delays or reminder countdowns. + Button("Alarm · 60 sec Countdown") { + startTestActivity( + tag: "debug-alarm", + title: "Security Alarm", + state: .init( + message: "Motion at back door · Arms in 60 seconds", + criticalText: "60 sec", + chronometer: true, + countdownEnd: Date().addingTimeInterval(60), + icon: "mdi:alarm-light", + color: "#F44336" ) - } - } header: { - Text("Debug · Static") - } footer: { - Text("Fixed state — no updates after start. Good for checking layout at a glance.") + ) } - Section { - // Progress bar advances through five named stages. - // criticalText tracks the current stage name in the DI compact trailing slot. - // Icon swaps from washing-machine to check-circle on the final update. - // Represents any multi-step appliance cycle automation. - Button("Washing Machine · Stage Labels (~12 s)") { startWashingMachineCycle() } - - // Numeric percentage in criticalText updates alongside the progress bar. - // Color shifts from green to yellow-green as the charge nears 100 %. - // Represents any "% complete with time remaining" automation pattern. - Button("EV Charging · Numeric % (~16 s)") { startEVChargingSimulation() } - - // The only scenario where both progress (playback position) and a live countdown - // (time remaining in track) are active and updating at the same time. - // Simulates a track change mid-sequence: progress resets, countdown resets. - Button("Media Player · Progress + Timer (~20 s)") { startMediaNowPlaying() } - - // Message, criticalText, and icon all change on every update — no progress bar. - // Represents automations where the status category itself changes (not just a value). - Button("Package Delivery · All Text Fields (~15 s)") { startPackageJourney() } - - // No progress bar — state communicated entirely through color and icon. - // Escalates orange (motion) → red (person) → green (all clear). - // Represents any alert-and-resolve automation pattern. - Button("Security Escalation · Color + Icon (~8 s)") { startSecuritySequence() } - - // Cycles through wash stages then calls activity.end() with .default dismissal. - // The only scenario that tests the full lifecycle: start → update → end. - // After ending, the final "Done" state lingers on the lock screen (up to 4 h). - Button("Dishwasher · Full Lifecycle, Ends Itself (~12 s)") { startDishwasherAutoComplete() } - - // Fires 6 updates 2 seconds apart (12 s total). - // On iOS 18 the system enforces ~15 s between rendered updates — some will be - // silently dropped. Watch the counter skip values to see the rate limit in action. - // On the simulator and iOS 17 all 6 updates should render. - Button("Rate Limit · 6 Rapid Updates, 2 s Apart (~12 s)") { startRapidUpdateStressTest() } - } header: { - Text("Debug · Animated") - } footer: { - Text( - "Activity updates itself after you tap. Tap, then immediately lock (⌘L) " + - "to watch updates on the lock screen in real time." + // Every ContentState field active at the same time. + // Lock screen shows: icon → live countdown → progress bar. + // criticalText ("5 min") visible in DI compact trailing only. + // Use this to confirm no layout collisions when all fields are populated. + Button("All Fields · Max Load") { + startTestActivity( + tag: "debug-all", + title: "All Fields", + state: .init( + message: "All content state fields active", + criticalText: "5 min", + progress: 42, + progressMax: 100, + chronometer: true, + countdownEnd: Date().addingTimeInterval(5 * 60), + icon: "mdi:home-assistant", + color: "#03A9F4" + ) ) } + } header: { + Text("Sample · Static") + } footer: { + Text("Fixed state — no updates after start. Good for checking layout at a glance.") } } - #endif - #if DEBUG + private var animatedSamplesSection: some View { + Section { + // Progress bar advances through five named stages. + // criticalText tracks the current stage name in the DI compact trailing slot. + // Icon swaps from washing-machine to check-circle on the final update. + // Represents any multi-step appliance cycle automation. + Button("Washing Machine · Stage Labels (~12 s)") { startWashingMachineCycle() } + + // Numeric percentage in criticalText updates alongside the progress bar. + // Color shifts from green to yellow-green as the charge nears 100 %. + // Represents any "% complete with time remaining" automation pattern. + Button("EV Charging · Numeric % (~16 s)") { startEVChargingSimulation() } + + // The only scenario where both progress (playback position) and a live countdown + // (time remaining in track) are active and updating at the same time. + // Simulates a track change mid-sequence: progress resets, countdown resets. + Button("Media Player · Progress + Timer (~20 s)") { startMediaNowPlaying() } + + // Message, criticalText, and icon all change on every update — no progress bar. + // Represents automations where the status category itself changes (not just a value). + Button("Package Delivery · All Text Fields (~15 s)") { startPackageJourney() } + + // No progress bar — state communicated entirely through color and icon. + // Escalates orange (motion) → red (person) → green (all clear). + // Represents any alert-and-resolve automation pattern. + Button("Security Escalation · Color + Icon (~8 s)") { startSecuritySequence() } + + // Cycles through wash stages then calls activity.end() with .default dismissal. + // The only scenario that tests the full lifecycle: start → update → end. + // After ending, the final "Done" state lingers on the lock screen (up to 4 h). + Button("Dishwasher · Full Lifecycle, Ends Itself (~12 s)") { startDishwasherAutoComplete() } + + // Fires 6 updates 2 seconds apart (12 s total). + // On iOS 18 the system enforces ~15 s between rendered updates — some will be + // silently dropped. Watch the counter skip values to see the rate limit in action. + // On the simulator and iOS 17 all 6 updates should render. + Button("Rate Limit · 6 Rapid Updates, 2 s Apart (~12 s)") { startRapidUpdateStressTest() } + } header: { + Text("Sample · Animated") + } footer: { + Text( + "Activity updates itself after you tap. Tap, then immediately lock (⌘L) " + + "to watch updates on the lock screen in real time." + ) + } + } - // MARK: - Debug helpers + // MARK: - Sample helpers /// Starts a single-state activity (no subsequent updates). private func startTestActivity(tag: String, title: String, state: HALiveActivityAttributes.ContentState) { @@ -564,53 +592,14 @@ struct LiveActivitySettingsView: View { ] ) } - #endif - private var privacySection: some View { - Section { - Label(L10n.LiveActivity.Privacy.message, systemSymbol: .lockShield) - .font(.footnote) - .foregroundStyle(.secondary) - } header: { - Text(L10n.LiveActivity.Section.privacy) - } - } - - @available(iOS 17.2, *) - private var frequentUpdatesSection: some View { - let appName = Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String ?? "Home Assistant" - return Section { - HStack { - Label(L10n.LiveActivity.FrequentUpdates.title, systemSymbol: .bolt) - Spacer() - if frequentUpdatesEnabled { - Text(L10n.LiveActivity.Status.enabled) - .foregroundStyle(.green) - } else { - Button(L10n.LiveActivity.Status.openSettings) { - if let url = URL(string: UIApplication.openSettingsURLString) { - UIApplication.shared.open(url) - } - } - .foregroundStyle(.secondary) - } - } - } header: { - Text(L10n.LiveActivity.FrequentUpdates.title) - } footer: { - Text(L10n.LiveActivity.FrequentUpdates.footer(appName)) - } - } - // MARK: - Data private func loadActivities() async { let info = ActivityAuthorizationInfo() authorizationEnabled = info.areActivitiesEnabled - if #available(iOS 17.2, *) { - frequentUpdatesEnabled = info.frequentPushesEnabled - } + frequentUpdatesEnabled = info.frequentPushesEnabled activities = Activity.activities.map { ActivitySnapshot(activity: $0) diff --git a/Sources/App/Settings/Settings/SettingsItem.swift b/Sources/App/Settings/Settings/SettingsItem.swift index 4e183efab..d3d0e35b1 100644 --- a/Sources/App/Settings/Settings/SettingsItem.swift +++ b/Sources/App/Settings/Settings/SettingsItem.swift @@ -147,24 +147,39 @@ enum SettingsItem: String, Hashable, CaseIterable { static var allVisibleCases: [SettingsItem] { allCases.filter { item in + if item == .liveActivities { + return canShowLiveActivities + } + // Filter based on platform #if targetEnvironment(macCatalyst) - if item == .servers || item == .gestures || item == .kiosk || item == .watch || item == .carPlay || - item == .complications || item == .nfc || item == .help || - item == .whatsNew { + let hiddenItems: [SettingsItem] = [ + .servers, + .gestures, + .kiosk, + .watch, + .carPlay, + .complications, + .nfc, + .help, + .whatsNew, + ] + + if hiddenItems.contains(item) { return false } #endif - // Live Activities are shown in DebugView - if item == .liveActivities { - return false - } + return true } } static var generalItems: [SettingsItem] { - [.general, .gestures, .location, .notifications, .kiosk] + var items: [SettingsItem] = [.general, .gestures, .location, .notifications, .kiosk] + if canShowLiveActivities { + items.append(.liveActivities) + } + return items } static var integrationItems: [SettingsItem] { @@ -186,6 +201,18 @@ enum SettingsItem: String, Hashable, CaseIterable { static var helpItems: [SettingsItem] { [.help, .privacy, .debugging] } + + private static var canShowLiveActivities: Bool { + #if os(iOS) && !targetEnvironment(macCatalyst) + if #available(iOS 17.2, *) { + return true + } else { + return false + } + #else + return false + #endif + } } // MARK: - Material Design Icons Image diff --git a/Sources/App/Settings/Settings/SettingsView.swift b/Sources/App/Settings/Settings/SettingsView.swift index 3dc3fab58..35b4b61f7 100644 --- a/Sources/App/Settings/Settings/SettingsView.swift +++ b/Sources/App/Settings/Settings/SettingsView.swift @@ -246,7 +246,7 @@ struct SettingsView: View { Label { HStack(spacing: DesignSystem.Spaces.one) { Text(item.title) - if item == .kiosk { + if [.kiosk, .liveActivities].contains(item) { LabsLabel() } } diff --git a/Sources/Shared/Resources/Swiftgen/Strings.swift b/Sources/Shared/Resources/Swiftgen/Strings.swift index ec3726280..bcf80f20b 100644 --- a/Sources/Shared/Resources/Swiftgen/Strings.swift +++ b/Sources/Shared/Resources/Swiftgen/Strings.swift @@ -1888,22 +1888,12 @@ public enum L10n { } } public enum FrequentUpdates { - /// Allows Home Assistant to update Live Activities up to once per second. Enable in Settings u203A %@ u203A Live Activities. - public static func footer(_ p1: Any) -> String { - return L10n.tr("Localizable", "live_activity.frequent_updates.footer", String(describing: p1)) - } /// Frequent Updates public static var title: String { return L10n.tr("Localizable", "live_activity.frequent_updates.title") } } - public enum Privacy { - /// Live Activity content is visible on your Lock Screen and Dynamic Island without Face ID or Touch ID. Choose what you display carefully. - public static var message: String { return L10n.tr("Localizable", "live_activity.privacy.message") } - } public enum Section { /// Active Activities public static var active: String { return L10n.tr("Localizable", "live_activity.section.active") } - /// Privacy - public static var privacy: String { return L10n.tr("Localizable", "live_activity.section.privacy") } /// Status public static var status: String { return L10n.tr("Localizable", "live_activity.section.status") } }