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
Paměť
+
Žá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
Hukommelse
+
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
Speicher
+
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
Geheugen
+
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
Mälu
+
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
Muisti
+
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é
Mémoire
+
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
Memorija
+
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
Emlékezet
+
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
Ingatan
+
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
Memoria
+
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
Atmiņa
+
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
Atmintis
+
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
Hukommelse
+
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
Pamięć
+
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
Memória
+
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
Memorie
+
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ý
Pamiatka
+
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
Spomin
+
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
Memoria
+
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
Minne
+
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ış
Hafıza
+
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
Ký ức
+
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
Ingatan
+
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
Memory
+
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
);