diff --git a/resources-ara/strings/strings.xml b/resources-ara/strings/strings.xml index eb30b49..a4263e5 100644 --- a/resources-ara/strings/strings.xml +++ b/resources-ara/strings/strings.xml @@ -31,6 +31,7 @@ مؤكد قائمة طعام ذاكرة + محدثة القائمة ، إعادة التشغيل. لا مفتاح API في إعدادات التطبيق. لا عنوان URL API في إعدادات التطبيق. لا يوجد عنوان URL للتكوين في إعدادات التطبيق. diff --git a/resources-bul/strings/strings.xml b/resources-bul/strings/strings.xml index 654ff6f..730eb35 100644 --- a/resources-bul/strings/strings.xml +++ b/resources-bul/strings/strings.xml @@ -31,6 +31,7 @@ Потвърдено Меню Памет + Менюто актуализирано, рестартиране. Няма ключ за API в настройките на приложението. Няма URL адрес на API в настройките на приложението. Няма URL адрес на конфигурация в настройките на приложението. diff --git a/resources-ces/strings/strings.xml b/resources-ces/strings/strings.xml index 80e17a6..e0a0817 100644 --- a/resources-ces/strings/strings.xml +++ b/resources-ces/strings/strings.xml @@ -31,6 +31,7 @@ Potvrzeno Menu Paměť + Aktualizováno nabídka, restartujte. Žádný klíč API v nastavení aplikace. Žádná URL API v nastavení aplikace. V nastavení aplikace není žádná konfigurační adresa URL. diff --git a/resources-dan/strings/strings.xml b/resources-dan/strings/strings.xml index e9ebe34..d83002b 100644 --- a/resources-dan/strings/strings.xml +++ b/resources-dan/strings/strings.xml @@ -31,6 +31,7 @@ Bekræftet Menu Hukommelse + Menu opdateret, genstart. Ingen API -nøgle i applikationsindstillingerne. Ingen API -URL i applikationsindstillingerne. Ingen konfigurations -URL i applikationsindstillingerne. diff --git a/resources-deu/strings/strings.xml b/resources-deu/strings/strings.xml index 596eb9d..5099be9 100644 --- a/resources-deu/strings/strings.xml +++ b/resources-deu/strings/strings.xml @@ -31,6 +31,7 @@ Bestätigt Menü Speicher + Menü aktualisiert, neu starten. Kein API-Schlüssel in den App-Einstellungen hinterlegt. Keine API-URL in den App-Einstellungen hinterlegt. Keine Menükonfigurations-URL (JSON) in den App-Einstellungen hinterlegt. diff --git a/resources-dut/strings/strings.xml b/resources-dut/strings/strings.xml index 1ecb1ea..ab0ec73 100644 --- a/resources-dut/strings/strings.xml +++ b/resources-dut/strings/strings.xml @@ -31,6 +31,7 @@ Bevestigd Menu Geheugen + Menu bijgewerkt, opnieuw opstarten. Geen API -toets in de toepassingsinstellingen. Geen API -URL in de toepassingsinstellingen. Geen configuratie -URL in de toepassingsinstellingen. diff --git a/resources-est/strings/strings.xml b/resources-est/strings/strings.xml index 77c8084..67b794b 100644 --- a/resources-est/strings/strings.xml +++ b/resources-est/strings/strings.xml @@ -31,6 +31,7 @@ Kinnitatud Menüü Mälu + Menüü värskendatud, taaskäivitage. Rakenduse seadetes pole API -klahvi. Rakenduse seadetes pole API URL -i. Rakenduse sätetes pole konfiguratsiooni URL -i. diff --git a/resources-fin/strings/strings.xml b/resources-fin/strings/strings.xml index f95ad91..1d9eb42 100644 --- a/resources-fin/strings/strings.xml +++ b/resources-fin/strings/strings.xml @@ -31,6 +31,7 @@ Vahvistettu Valikko Muisti + Valikko päivitetty, käynnistä uudelleen. Ei sovellusliittymää avainta sovellusasetuksissa. Ei sovellus -URL -osoitetta sovellusasetuksissa. Ei määritys -URL -osoitetta sovellusasetuksissa. diff --git a/resources-fre/strings/strings.xml b/resources-fre/strings/strings.xml index 4bc8a29..2d1b7fe 100644 --- a/resources-fre/strings/strings.xml +++ b/resources-fre/strings/strings.xml @@ -31,6 +31,7 @@ Confirmé Menu Mémoire + Menu mis à jour, redémarrer. Aucune clé API dans les paramètres de l'application. Aucune URL de l'API dans les paramètres de l'application. Aucune URL de configuration dans les paramètres de l'application. diff --git a/resources-gre/strings/strings.xml b/resources-gre/strings/strings.xml index 33c56e0..cedaac7 100644 --- a/resources-gre/strings/strings.xml +++ b/resources-gre/strings/strings.xml @@ -31,6 +31,7 @@ Επιβεβαιωμένος Μενού Μνήμη + Ενημερώθηκε μενού, επανεκκίνηση. Δεν υπάρχει κλειδί API στις ρυθμίσεις εφαρμογής. Δεν υπάρχει διεύθυνση URL API στις ρυθμίσεις εφαρμογής. Χωρίς διευθύνσεις διαμόρφωσης στις ρυθμίσεις εφαρμογής. diff --git a/resources-heb/strings/strings.xml b/resources-heb/strings/strings.xml index cb7e4ff..3eb50b2 100644 --- a/resources-heb/strings/strings.xml +++ b/resources-heb/strings/strings.xml @@ -31,6 +31,7 @@ מְאוּשָׁר תַפרִיט זֵכֶר + מעודכן בתפריט, הפעל מחדש. אין מפתח API בהגדרות היישום. אין כתובת URL בהגדרות היישום. אין כתובת אתר תצורה בהגדרות היישום. diff --git a/resources-hrv/strings/strings.xml b/resources-hrv/strings/strings.xml index d40b62a..53cb29a 100644 --- a/resources-hrv/strings/strings.xml +++ b/resources-hrv/strings/strings.xml @@ -31,6 +31,7 @@ Potvrđen Jelovnik Memorija + Izbornik Ažurirano, ponovno pokrenite. Nema API ključa u postavkama aplikacije. Nema URL -a API -ja u postavkama aplikacije. Nema URL -a konfiguracije u postavkama aplikacije. diff --git a/resources-hun/strings/strings.xml b/resources-hun/strings/strings.xml index 40ac5ba..af27d13 100644 --- a/resources-hun/strings/strings.xml +++ b/resources-hun/strings/strings.xml @@ -31,6 +31,7 @@ Megerősített Menü Emlékezet + A menü frissítve, indítsa újra. Nincs API -kulcs az alkalmazásbeállításokban. Nincs API URL az alkalmazás beállításaiban. Nincs konfigurációs URL az alkalmazásbeállításokban. diff --git a/resources-ind/strings/strings.xml b/resources-ind/strings/strings.xml index 6129b42..0c2b72a 100644 --- a/resources-ind/strings/strings.xml +++ b/resources-ind/strings/strings.xml @@ -31,6 +31,7 @@ Dikonfirmasi Menu Ingatan + Menu diperbarui, restart. Tidak ada kunci API di pengaturan aplikasi. Tidak ada URL API di pengaturan aplikasi. Tidak ada URL konfigurasi di pengaturan aplikasi. diff --git a/resources-ita/strings/strings.xml b/resources-ita/strings/strings.xml index 5fd990b..a4d5b48 100644 --- a/resources-ita/strings/strings.xml +++ b/resources-ita/strings/strings.xml @@ -31,6 +31,7 @@ Confermato Menu Memoria + Menu aggiornato, riavvio. Nessuna chiave API nelle impostazioni dell'applicazione. Nessun URL API nelle impostazioni dell'applicazione. Nessun URL di configurazione nelle impostazioni dell'applicazione. diff --git a/resources-jpn/strings/strings.xml b/resources-jpn/strings/strings.xml index 6fcb1fe..a8e0f68 100644 --- a/resources-jpn/strings/strings.xml +++ b/resources-jpn/strings/strings.xml @@ -31,6 +31,7 @@ 確認済み メニュー メモリ + メニューの更新、再起動。 アプリケーション設定にAPIキーはありません。 アプリケーション設定にAPI URLはありません。 アプリケーション設定に構成URLはありません。 diff --git a/resources-kor/strings/strings.xml b/resources-kor/strings/strings.xml index 616278a..0a840d3 100644 --- a/resources-kor/strings/strings.xml +++ b/resources-kor/strings/strings.xml @@ -31,6 +31,7 @@ 확인 메뉴 메모리 + 메뉴가 업데이트되고 다시 시작됩니다. 응용 프로그램 설정에 API 키가 없습니다. 응용 프로그램 설정에 API URL이 없습니다. 응용 프로그램 설정에 구성 URL이 없습니다. diff --git a/resources-lav/strings/strings.xml b/resources-lav/strings/strings.xml index 058ff4d..f1bea72 100644 --- a/resources-lav/strings/strings.xml +++ b/resources-lav/strings/strings.xml @@ -31,6 +31,7 @@ Apstiprināts Ēdienkarte Atmiņa + Atjaunināta izvēlne, restartējiet. Lietojumprogrammas iestatījumos nav API atslēgas. Lietojumprogrammu iestatījumos nav API URL. Lietojumprogrammas iestatījumos nav konfigurācijas URL. @@ -54,7 +55,7 @@ Izpildīt pār wi-fi/lte? Sūtot mājas palīgu. Dati nav saņemti. - + Atlasiet ... API atslēga Homeassistant. Ilgstoša piekļuves marķieris. diff --git a/resources-lit/strings/strings.xml b/resources-lit/strings/strings.xml index 7c90bf0..9a7a864 100644 --- a/resources-lit/strings/strings.xml +++ b/resources-lit/strings/strings.xml @@ -31,6 +31,7 @@ Patvirtinta Meniu Atmintis + Meniu Atnaujinta, paleiskite iš naujo. Nėra API rakto programos nustatymuose. Nėra API URL programos nustatymuose. Nėra konfigūracijos URL programos nustatymuose. diff --git a/resources-nob/strings/strings.xml b/resources-nob/strings/strings.xml index 1625ded..7c0eef7 100644 --- a/resources-nob/strings/strings.xml +++ b/resources-nob/strings/strings.xml @@ -31,6 +31,7 @@ Bekreftet Meny Hukommelse + Meny oppdatert, omstart. Ingen API -nøkkel i applikasjonsinnstillingene. Ingen API -URL i applikasjonsinnstillingene. Ingen konfigurasjons -URL i applikasjonsinnstillingene. diff --git a/resources-pol/strings/strings.xml b/resources-pol/strings/strings.xml index f8e742b..9e5fc4e 100644 --- a/resources-pol/strings/strings.xml +++ b/resources-pol/strings/strings.xml @@ -31,6 +31,7 @@ Potwierdzony Menu Pamięć + Zaktualizowano menu, uruchom ponownie. Brak klucza API w ustawieniach aplikacji. Brak adresu URL API w ustawieniach aplikacji. Brak adresu URL konfiguracji w ustawieniach aplikacji. diff --git a/resources-por/strings/strings.xml b/resources-por/strings/strings.xml index b4b9905..2aa29a5 100644 --- a/resources-por/strings/strings.xml +++ b/resources-por/strings/strings.xml @@ -31,6 +31,7 @@ Confirmado Menu Memória + Menu Atualizado, reinicie. Nenhuma chave da API nas configurações do aplicativo. Nenhum URL da API nas configurações do aplicativo. Nenhum URL de configuração nas configurações do aplicativo. diff --git a/resources-ron/strings/strings.xml b/resources-ron/strings/strings.xml index 40b3f5c..cd1f9e4 100644 --- a/resources-ron/strings/strings.xml +++ b/resources-ron/strings/strings.xml @@ -31,6 +31,7 @@ Confirmat Meniu Memorie + Meniu actualizat, reporniți. Nici o cheie API în setările aplicației. Fără URL API în setările aplicației. Fără URL de configurare în setările aplicației. diff --git a/resources-slo/strings/strings.xml b/resources-slo/strings/strings.xml index 4a1b8f5..b308dc6 100644 --- a/resources-slo/strings/strings.xml +++ b/resources-slo/strings/strings.xml @@ -31,6 +31,7 @@ Spustený Ponuka Pamiatka + Aktualizované menu, reštart. V nastaveniach aplikácie chýba kľúč API V nastaveniach aplikácie chýba adresa URL rozhrania API V nastaveniach aplikácie chýba konfiguračná adresa URL diff --git a/resources-slv/strings/strings.xml b/resources-slv/strings/strings.xml index 883d697..eb74110 100644 --- a/resources-slv/strings/strings.xml +++ b/resources-slv/strings/strings.xml @@ -31,6 +31,7 @@ Potrjeno Meni Spomin + Meni posodobljen, znova zaženite. V nastavitvah aplikacije ni ključa API -ja. V nastavitvah aplikacije ni URL API -ja. V nastavitvah aplikacije ni URL konfiguracije. diff --git a/resources-spa/strings/strings.xml b/resources-spa/strings/strings.xml index c524380..0e3714d 100644 --- a/resources-spa/strings/strings.xml +++ b/resources-spa/strings/strings.xml @@ -31,6 +31,7 @@ Confirmado Menú Memoria + Menú actualizado, reiniciar. No hay clave API en la configuración de la aplicación. No hay URL de API en la configuración de la aplicación. No hay URL de configuración en la configuración de la aplicación. diff --git a/resources-swe/strings/strings.xml b/resources-swe/strings/strings.xml index b697b07..eae5fc3 100644 --- a/resources-swe/strings/strings.xml +++ b/resources-swe/strings/strings.xml @@ -31,6 +31,7 @@ Bekräftad Meny Minne + Meny Uppdaterad, omstart. Ingen API -nyckel i applikationsinställningarna. Ingen API -URL i applikationsinställningarna. Ingen konfigurations -URL i applikationsinställningarna. diff --git a/resources-tha/strings/strings.xml b/resources-tha/strings/strings.xml index 617f70b..a36312c 100644 --- a/resources-tha/strings/strings.xml +++ b/resources-tha/strings/strings.xml @@ -31,6 +31,7 @@ ที่ได้ยืนยันแล้ว เมนู หน่วยความจำ + อัปเดตเมนูรีสตาร์ท ไม่มีคีย์ API ในการตั้งค่าแอปพลิเคชัน ไม่มี URL API ในการตั้งค่าแอปพลิเคชัน ไม่มี URL การกำหนดค่าในการตั้งค่าแอปพลิเคชัน diff --git a/resources-tur/strings/strings.xml b/resources-tur/strings/strings.xml index 2f3f6f3..cfb91a8 100644 --- a/resources-tur/strings/strings.xml +++ b/resources-tur/strings/strings.xml @@ -31,6 +31,7 @@ Onaylanmış Menü Hafıza + Menü güncellendi, yeniden başlat. Uygulama ayarlarında API anahtarı yok. Uygulama ayarlarında API URL'si yok. Uygulama ayarlarında yapılandırma URL'si yok. diff --git a/resources-ukr/strings/strings.xml b/resources-ukr/strings/strings.xml index f9dd76f..fb50cac 100644 --- a/resources-ukr/strings/strings.xml +++ b/resources-ukr/strings/strings.xml @@ -31,6 +31,7 @@ Підтверджений Меню Пам'ять + Меню оновлено, перезапустіть. Немає ключа API в налаштуваннях програми. Немає URL -адреси API в налаштуваннях програми. Немає URL -адреси конфігурації в налаштуваннях програми. diff --git a/resources-vie/strings/strings.xml b/resources-vie/strings/strings.xml index 8af1dd4..b5e30e6 100644 --- a/resources-vie/strings/strings.xml +++ b/resources-vie/strings/strings.xml @@ -31,6 +31,7 @@ Xác nhận Menu Ký ức + Menu được cập nhật, khởi động lại. Không có khóa API trong cài đặt ứng dụng. Không có URL API trong cài đặt ứng dụng. Không có URL cấu hình trong cài đặt ứng dụng. diff --git a/resources-zhs/strings/strings.xml b/resources-zhs/strings/strings.xml index 60df8c0..cf151dc 100644 --- a/resources-zhs/strings/strings.xml +++ b/resources-zhs/strings/strings.xml @@ -31,6 +31,7 @@ 确认的 菜单 记忆 + 菜单更新,重新启动。 应用程序设置中没有API密钥。 应用程序设置中没有API URL。 应用程序设置中没有配置URL。 diff --git a/resources-zht/strings/strings.xml b/resources-zht/strings/strings.xml index 9689419..89133c9 100644 --- a/resources-zht/strings/strings.xml +++ b/resources-zht/strings/strings.xml @@ -31,6 +31,7 @@ 確認的 菜單 記憶 + 菜單更新,重新啟動。 應用程序設置中沒有API密鑰。 應用程序設置中沒有API URL。 應用程序設置中沒有配置URL。 diff --git a/resources-zsm/strings/strings.xml b/resources-zsm/strings/strings.xml index 8f15114..8fc11d8 100644 --- a/resources-zsm/strings/strings.xml +++ b/resources-zsm/strings/strings.xml @@ -31,6 +31,7 @@ Disahkan Menu Ingatan + Menu dikemas kini, mulakan semula. Tiada kunci API dalam tetapan aplikasi. Tiada URL API dalam tetapan aplikasi. Tiada URL Konfigurasi dalam Tetapan Aplikasi. diff --git a/resources/strings/strings.xml b/resources/strings/strings.xml index 02d2439..1ee98e8 100644 --- a/resources/strings/strings.xml +++ b/resources/strings/strings.xml @@ -25,6 +25,7 @@ Confirmed Menu Memory + Menu updated, restart. No API key in the application settings. No API URL in the application settings. No configuration URL in the application settings. diff --git a/source/HomeAssistantApp.mc b/source/HomeAssistantApp.mc index 776c007..6dd0e39 100644 --- a/source/HomeAssistantApp.mc +++ b/source/HomeAssistantApp.mc @@ -16,6 +16,8 @@ using Toybox.Application; using Toybox.Communications; using Toybox.Lang; +// Required for callback method definition +typedef Method as Toybox.Lang.Method; using Toybox.WatchUi; using Toybox.System; using Toybox.Application.Properties; @@ -40,6 +42,7 @@ class HomeAssistantApp extends Application.AppBase { private var mUpdating as Lang.Boolean = false; // Don't start a second chain of updates private var mTemplates as Lang.Dictionary = {}; private var mNotifiedNoBle as Lang.Boolean = false; + private var mIsCacheChecked as Lang.Boolean = false; //! Class Constructor // @@ -257,39 +260,14 @@ class HomeAssistantApp extends Application.AppBase { } else { var menu = Storage.getValue("menu") as Lang.Dictionary; if (menu != null and (Settings.getClearCache() || !Settings.getCacheConfig())) { + // System.println("HomeAssistantApp fetchMenuConfig(): Clearing cached menu on user request."); Storage.deleteValue("menu"); menu = null; Settings.unsetClearCache(); } if (menu == null) { - var phoneConnected = System.getDeviceSettings().phoneConnected; - var internetAvailable = System.getDeviceSettings().connectionAvailable; - if (! phoneConnected or ! internetAvailable) { - // System.println("HomeAssistantApp fetchMenuConfig(): No Phone connection, skipping API call."); - var errorRez = $.Rez.Strings.NoPhone; - if (Settings.getWifiLteExecutionEnabled()) { - errorRez = $.Rez.Strings.NoPhoneNoCache; - } else if (! internetAvailable) { - errorRez = $.Rez.Strings.Unavailable; - } - if (!mIsApp) { - WatchUi.requestUpdate(); - } else { - ErrorView.show(WatchUi.loadResource(errorRez) as Lang.String); - } - mMenuStatus = WatchUi.loadResource(errorRez) as Lang.String; - } else { - Communications.makeWebRequest( - Settings.getConfigUrl(), - null, - { - :method => Communications.HTTP_REQUEST_METHOD_GET, - :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON, - :headers => Settings.augmentHttpHeaders({}) - }, - method(:onReturnFetchMenuConfig) - ); - } + // System.println("HomeAssistantApp fetchMenuConfig(): Menu not cached, fetching."); + fetchMenuConfigBasic(method(:onReturnFetchMenuConfig)); } else { mMenuStatus = WatchUi.loadResource($.Rez.Strings.Cached) as Lang.String; WatchUi.requestUpdate(); @@ -304,6 +282,56 @@ class HomeAssistantApp extends Application.AppBase { return false; } + //! The basic API call to fetch the menu configuration, with cache management issues managed by external supporting + //! code. This is factored out separately so that it can be reused to check and validate the cached menu. + //! + //! @param responseCallback The method to call on completion of the GET request. + // + function fetchMenuConfigBasic( + responseCallback as ( + Method( + responseCode as Lang.Number, + data as Lang.Dictionary or Lang.String or Null + ) as Void + ) or ( + Method( + responseCode as Lang.Number, + data as Lang.Dictionary or Lang.String or Null, + context as Lang.Object + ) as Void + ) + ) { + // System.println("HomeAssistantApp fetchMenuConfigBasic(): Fetching JSON menu."); + var phoneConnected = System.getDeviceSettings().phoneConnected; + var internetAvailable = System.getDeviceSettings().connectionAvailable; + if (! phoneConnected or ! internetAvailable) { + // System.println("HomeAssistantApp fetchMenuConfigBasic(): No Phone connection, skipping API call."); + var errorRez = $.Rez.Strings.NoPhone; + if (Settings.getWifiLteExecutionEnabled()) { + errorRez = $.Rez.Strings.NoPhoneNoCache; + } else if (! internetAvailable) { + errorRez = $.Rez.Strings.Unavailable; + } + if (!mIsApp) { + WatchUi.requestUpdate(); + } else { + ErrorView.show(WatchUi.loadResource(errorRez) as Lang.String); + } + mMenuStatus = WatchUi.loadResource(errorRez) as Lang.String; + } else { + Communications.makeWebRequest( + Settings.getConfigUrl(), + null, + { + :method => Communications.HTTP_REQUEST_METHOD_GET, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON, + :headers => Settings.augmentHttpHeaders({}) + }, + responseCallback + ); + } + } + //! Build the menu and store in `mHaMenu`. Then start updates if necessary. //! //! @param menu The dictionary derived from the JSON menu fetched by `fetchMenuConfig()`. @@ -342,6 +370,146 @@ class HomeAssistantApp extends Application.AppBase { } } + //! Test if two dictionaries are structurally equal. Used to see if the JSON menu has been + //! amended but yet to be updated in the application cache. + //! + //! @param a First dictionary in the comparison. + //! @param b Second dictionary in the comparison. + // + function structuralEquals( + a as Lang.Dictionary, + b as Lang.Dictionary + ) as Lang.Boolean { + if (a.size() != b.size()) { + return false; + } + var keys = a.keys(); + for (var i = 0; i < keys.size(); i++) { + var key = keys[i]; + if (!b.hasKey(key)) { + return false; + } + var valA = a.get(key); + var valB = b.get(key); + if (valA instanceof Lang.Dictionary and valB instanceof Lang.Dictionary) { + if (!structuralEquals(valA, valB)) { + return false; + } + } else if (valA instanceof Lang.Array and valB instanceof Lang.Array) { + var arrA = valA as Lang.Array; + var arrB = valB as Lang.Array; + if (arrA.size() != arrB.size()) { + return false; + } + for (var j = 0; j < arrA.size(); j++) { + var itemA = arrA[j]; + var itemB = arrB[j]; + if (itemA instanceof Lang.Dictionary and itemB instanceof Lang.Dictionary) { + if (!structuralEquals(itemA, itemB)) { + return false; + } + } else if (!itemA.equals(itemB)) { + return false; + } + } + } else if (!valA.equals(valB)) { + return false; + } + } + return true; + } + + //! Callback function for the menu check GET request. + //! + //! @param responseCode Response code. + //! @param data Response data. + // + function onReturnCheckMenuConfig( + responseCode as Lang.Number, + data as Null or Lang.Dictionary + ) as Void { + // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: " + responseCode); + // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Data: " + data); + + switch (responseCode) { + case Communications.BLE_HOST_TIMEOUT: + case Communications.BLE_CONNECTION_UNAVAILABLE: + // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed."); + ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoPhone) as Lang.String); + break; + + case Communications.BLE_QUEUE_FULL: + // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: BLE_QUEUE_FULL, API calls too rapid."); + ErrorView.show(WatchUi.loadResource($.Rez.Strings.ApiFlood) as Lang.String); + break; + + case Communications.NETWORK_REQUEST_TIMED_OUT: + // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection."); + ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoResponse) as Lang.String); + break; + + case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE: + // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned."); + ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoJson) as Lang.String); + break; + + case Communications.NETWORK_RESPONSE_OUT_OF_MEMORY: + // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: NETWORK_RESPONSE_OUT_OF_MEMORY, are we going too fast?"); + var myTimer = new Timer.Timer(); + // Now this feels very "closely coupled" to the application, but it is the most reliable method instead of using a timer. + myTimer.start(method(:updateMenuItems), Globals.scApiBackoffMs, false); + break; + + case 404: + // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: 404, page not found. Check API URL setting."); + ErrorView.show(WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String); + break; + + case 400: + // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: 400, bad request. Template error."); + ErrorView.show(WatchUi.loadResource($.Rez.Strings.TemplateError) as Lang.String); + break; + + case 200: + if (data != null) { + // 'menu' will be null if caching has just been enabled, but not yet cached locally. + var menu = Storage.getValue("menu") as Lang.Dictionary; + if (menu == null || !structuralEquals(data, menu)) { + // System.println("HomeAssistantApp onReturnCheckMenuConfig() New menu found."); + Storage.setValue("menu", data as Lang.Dictionary); + if (menu != null) { + // Notify the the user we have just got a newer menu file + var toast = WatchUi.loadResource($.Rez.Strings.MenuUpdated) as Lang.String; + if (mHasToast) { + WatchUi.showToast(toast, null); + } else { + new Alert({ + :timeout => Globals.scAlertTimeoutMs, + :font => Graphics.FONT_MEDIUM, + :text => toast, + :fgcolor => Graphics.COLOR_WHITE, + :bgcolor => Graphics.COLOR_BLACK + }).pushView(WatchUi.SLIDE_IMMEDIATE); + } + } + } + // Prevent checking the cache is up to date again + mIsCacheChecked = true; + var delay = Settings.getPollDelay(); + if (delay > 0) { + mUpdateTimer.start(method(:updateMenuItems), delay, false); + } else { + updateMenuItems(); + } + } + break; + + default: + // System.println("HomeAssistantApp onReturnCheckMenuConfig(): Unhandled HTTP response code = " + responseCode); + ErrorView.show(WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr) as Lang.String + responseCode); + } + } + //! Callback function for each menu update GET request. //! //! @param responseCode Response code. @@ -405,18 +573,23 @@ class HomeAssistantApp extends Application.AppBase { } else { if (mItemsToUpdate != null) { for (var i = 0; i < mItemsToUpdate.size(); i++) { - var item = mItemsToUpdate[i]; + var item = mItemsToUpdate[i]; var state = data.get(i.toString()); item.updateState(state); if (item instanceof HomeAssistantToggleMenuItem) { (item as HomeAssistantToggleMenuItem).updateToggleState(data.get(i.toString() + "t")); } } - var delay = Settings.getPollDelay(); - if (delay > 0) { - mUpdateTimer.start(method(:updateMenuItems), delay, false); + if (Settings.getCacheConfig() && !mIsCacheChecked) { + // We are caching the menu configuration, so let's fetch it and check if its been updated. + fetchMenuConfigBasic(method(:onReturnCheckMenuConfig)); } else { - updateMenuItems(); + var delay = Settings.getPollDelay(); + if (delay > 0) { + mUpdateTimer.start(method(:updateMenuItems), delay, false); + } else { + updateMenuItems(); + } } } } @@ -605,7 +778,6 @@ class HomeAssistantApp extends Application.AppBase { if (!mIsApp) { WatchUi.requestUpdate(); } else { - System.println("we here"); ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoPhone) as Lang.String); } } else if (! connectionAvailable) { diff --git a/source/HomeAssistantConfirmation.mc b/source/HomeAssistantConfirmation.mc index cf3907d..2eac1e8 100644 --- a/source/HomeAssistantConfirmation.mc +++ b/source/HomeAssistantConfirmation.mc @@ -14,8 +14,6 @@ //----------------------------------------------------------------------------------- using Toybox.Lang; -// Required for callback method definition -typedef Method as Toybox.Lang.Method; using Toybox.WatchUi; using Toybox.Timer; using Toybox.Application.Properties; diff --git a/source/HomeAssistantService.mc b/source/HomeAssistantService.mc index 459c189..91696ab 100644 --- a/source/HomeAssistantService.mc +++ b/source/HomeAssistantService.mc @@ -128,18 +128,18 @@ class HomeAssistantService { data as Lang.Dictionary?, exit as Lang.Boolean ) as Void { - var phoneConnected = System.getDeviceSettings().phoneConnected; + var phoneConnected = System.getDeviceSettings().phoneConnected; var internetAvailable = System.getDeviceSettings().connectionAvailable; if (Settings.getWifiLteExecutionEnabled() && (! phoneConnected || ! internetAvailable)) { var dialogMsg = WatchUi.loadResource($.Rez.Strings.WifiLtePrompt) as Lang.String; - var dialog = new WatchUi.Confirmation(dialogMsg); + var dialog = new WatchUi.Confirmation(dialogMsg); WatchUi.pushView( dialog, new WifiLteExecutionConfirmDelegate({ - :type => "service", + :type => "service", :service => service, - :data => data, - :exit => exit, + :data => data, + :exit => exit, }, dialog), WatchUi.SLIDE_LEFT );