diff --git a/source/HomeAssistantSyncDelegate.mc b/source/HomeAssistantSyncDelegate.mc new file mode 100644 index 0000000..f8ff6f6 --- /dev/null +++ b/source/HomeAssistantSyncDelegate.mc @@ -0,0 +1,112 @@ +using Toybox.Communications; +using Toybox.Lang; + +// SyncDelegate to execute single command via POST request to Home Assistant +// +class HomeAssistantSyncDelegate extends Communications.SyncDelegate { + private static var syncError as Lang.String or Null; + + // Initialize an instance of this delegate + public function initialize() { + SyncDelegate.initialize(); + } + + //! Called by the system to determine if a sync is needed + public function isSyncNeeded() as Lang.Boolean { + return true; + } + + //! Called by the system when starting a bulk sync. + public function onStartSync() as Void { + syncError = null; + + if (WifiLteExecutionConfirmDelegate.mCommandData == null) { + syncError = WatchUi.loadResource($.Rez.Strings.WifiLteExecutionDataError) as Lang.String; + onStopSync(); + return; + } + + var type = WifiLteExecutionConfirmDelegate.mCommandData[:type]; + var data = WifiLteExecutionConfirmDelegate.mCommandData[:data]; + var url; + + switch (type) { + case "service": + var service = WifiLteExecutionConfirmDelegate.mCommandData[:service]; + url = Settings.getApiUrl() + "/services/" + service.substring(0, service.find(".")) + "/" + service.substring(service.find(".")+1, service.length()); + var entity_id = ""; + if (data != null) { + entity_id = data.get("entity_id"); + if (entity_id == null) { + entity_id = ""; + } + } + performRequest(url, data); + break; + case "entity": + url = WifiLteExecutionConfirmDelegate.mCommandData[:url]; + performRequest(url, data); + break; + } + } + + // Performs a POST request to Hass with a given payload and URL, and calls haCallback + private function performRequest(url as Lang.String, data as Lang.Dictionary or Null) { + Communications.makeWebRequest( + url, + data, // May include {"entity_id": xxxx} for service calls + { + :method => Communications.HTTP_REQUEST_METHOD_POST, + :headers => { + "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, + "Authorization" => "Bearer " + Settings.getApiKey() + }, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON + }, + method(:haCallback) + ); + } + + //! Handle callback from request + public function haCallback(code as Lang.Number, data as Null or Lang.Dictionary) as Void { + Communications.notifySyncProgress(100); + if (code == 200) { + syncError = null; + if (WifiLteExecutionConfirmDelegate.mCommandData[:type].equals("entity")) { + var callbackMethod = WifiLteExecutionConfirmDelegate.mCommandData[:callback]; + if (callbackMethod != null) { + var d = data as Lang.Array; + callbackMethod.invoke(d); + } + } + onStopSync(); + return; + } + + switch(code) { + case Communications.NETWORK_REQUEST_TIMED_OUT: + syncError = WatchUi.loadResource($.Rez.Strings.TimedOut) as Lang.String; + break; + case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE: + syncError = WatchUi.loadResource($.Rez.Strings.NoJson) as Lang.String; + syncError = ""; + default: + var codeMsg = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr) as Lang.String; + syncError = codeMsg + code; + break; + } + + onStopSync(); + } + + //! Clean up + public function onStopSync() as Void { + if (WifiLteExecutionConfirmDelegate.mCommandData[:exit]) { + System.exit(); + } + + Communications.cancelAllRequests(); + Communications.notifySyncComplete(syncError); + + } +} diff --git a/source/WifiLteExecution.mc b/source/WifiLteExecutionConfirmDelegate.mc similarity index 54% rename from source/WifiLteExecution.mc rename to source/WifiLteExecutionConfirmDelegate.mc index 48722dc..5477213 100644 --- a/source/WifiLteExecution.mc +++ b/source/WifiLteExecutionConfirmDelegate.mc @@ -46,6 +46,8 @@ class WifiLteExecutionConfirmDelegate extends WatchUi.ConfirmationDelegate { :confirmMethod as Lang.Method, :state as Lang.Boolean } or Null) { + ConfirmationDelegate.initialize(); + if (WatchUi has :showToast) { mHasToast = true; } @@ -68,8 +70,6 @@ class WifiLteExecutionConfirmDelegate extends WatchUi.ConfirmationDelegate { mTimer = new Timer.Timer(); mTimer.start(method(:onTimeout), timeout, true); } - - ConfirmationDelegate.initialize(); } //! Handles the user's response to the confirmation dialog. @@ -77,6 +77,10 @@ class WifiLteExecutionConfirmDelegate extends WatchUi.ConfirmationDelegate { //! @param response The user's confirmation response as `WatchUi.Confirm` //! @return Always returns `true` to indicate the response was handled. function onResponse(response) as Lang.Boolean { + if (mTimer != null) { + mTimer.stop(); + } + if (response == WatchUi.CONFIRM_YES) { if (mToggleMethod != null) { mToggleMethod.invoke(mToggleState); @@ -104,8 +108,12 @@ class WifiLteExecutionConfirmDelegate extends WatchUi.ConfirmationDelegate { } if (possibleConnection) { - var syncString = WatchUi.loadResource($.Rez.Strings.WifiLteExecutionTitle) as Lang.String; - Communications.startSync2({:message => syncString}); + if (Communications has :startSync2) { + var syncString = WatchUi.loadResource($.Rez.Strings.WifiLteExecutionTitle) as Lang.String; + Communications.startSync2({:message => syncString}); + } else { + Communications.startSync(); + } } else { var toast = WatchUi.loadResource($.Rez.Strings.WifiLteNotAvailable) as Lang.String; if (mHasToast) { @@ -127,110 +135,4 @@ class WifiLteExecutionConfirmDelegate extends WatchUi.ConfirmationDelegate { mTimer.stop(); WatchUi.popView(WatchUi.SLIDE_RIGHT); } -} - -class HomeAssistantSyncDelegate extends Communications.SyncDelegate { - private static var syncError as Lang.String or Null; - - // Initialize an instance of this delegate - public function initialize() { - SyncDelegate.initialize(); - } - - //! Called by the system to determine if a sync is needed - public function isSyncNeeded() as Lang.Boolean { - return true; - } - - //! Called by the system when starting a bulk sync. - public function onStartSync() as Void { - syncError = null; - - if (WifiLteExecutionConfirmDelegate.mCommandData == null) { - syncError = WatchUi.loadResource($.Rez.Strings.WifiLteExecutionDataError) as Lang.String; - onStopSync(); - return; - } - - var type = WifiLteExecutionConfirmDelegate.mCommandData[:type]; - var data = WifiLteExecutionConfirmDelegate.mCommandData[:data]; - var url; - - switch (type) { - case "service": - var service = WifiLteExecutionConfirmDelegate.mCommandData[:service]; - url = Settings.getApiUrl() + "/services/" + service.substring(0, service.find(".")) + "/" + service.substring(service.find(".")+1, service.length()); - var entity_id = ""; - if (data != null) { - entity_id = data.get("entity_id"); - if (entity_id == null) { - entity_id = ""; - } - } - performRequest(url, data); - break; - case "entity": - url = WifiLteExecutionConfirmDelegate.mCommandData[:url]; - performRequest(url, data); - break; - } - } - - // Performs a POST request to Hass with a given payload and URL, and calls haCallback - private function performRequest(url as Lang.String, data as Lang.Dictionary or Null) { - Communications.makeWebRequest( - url, - data, // May include {"entity_id": xxxx} for service calls - { - :method => Communications.HTTP_REQUEST_METHOD_POST, - :headers => { - "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, - "Authorization" => "Bearer " + Settings.getApiKey() - }, - :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON - }, - method(:haCallback) - ); - } - - //! Handle callback from request - public function haCallback(code as Lang.Number, data as Null or Lang.Dictionary) as Void { - if (code == 200) { - syncError = null; - if (WifiLteExecutionConfirmDelegate.mCommandData[:type].equals("entity")) { - var callbackMethod = WifiLteExecutionConfirmDelegate.mCommandData[:callback]; - if (callbackMethod != null) { - var d = data as Lang.Array; - callbackMethod.invoke(d); - } - } - onStopSync(); - return; - } - - switch(code) { - case Communications.NETWORK_REQUEST_TIMED_OUT: - syncError = WatchUi.loadResource($.Rez.Strings.TimedOut) as Lang.String; - break; - case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE: - syncError = WatchUi.loadResource($.Rez.Strings.NoJson) as Lang.String; - syncError = ""; - default: - var codeMsg = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr) as Lang.String; - syncError = codeMsg + code; - break; - } - - onStopSync(); - } - - //! Clean up - public function onStopSync() as Void { - if (WifiLteExecutionConfirmDelegate.mCommandData[:exit]) { - System.exit(); - } - - Communications.cancelAllRequests(); - Communications.notifySyncComplete(syncError); - } -} +} \ No newline at end of file