diff --git a/resources/strings/strings.xml b/resources/strings/strings.xml index c03c3ec..052e264 100644 --- a/resources/strings/strings.xml +++ b/resources/strings/strings.xml @@ -32,6 +32,7 @@ No JSON returned from HTTP request. HTTP request returned error code = API URL must not have a trailing slash '/' + Failed to register Webhook Available Checking... Unavailable diff --git a/source/RezStrings.mc b/source/RezStrings.mc index 7c0bda4..2344bbd 100644 --- a/source/RezStrings.mc +++ b/source/RezStrings.mc @@ -47,6 +47,7 @@ class RezStrings { private static var strNoJson as Lang.String or Null; private static var strUnhandledHttpErr as Lang.String or Null; private static var strTrailingSlashErr as Lang.String or Null; + private static var strWebhookFailed as Lang.String or Null; (:glance) private static var strAvailable as Lang.String or Null; (:glance) @@ -98,6 +99,7 @@ class RezStrings { strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson); strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr); strTrailingSlashErr = WatchUi.loadResource($.Rez.Strings.TrailingSlashErr); + strWebhookFailed = WatchUi.loadResource($.Rez.Strings.WebhookFailed); strAvailable = WatchUi.loadResource($.Rez.Strings.Available); strChecking = WatchUi.loadResource($.Rez.Strings.Checking); strUnavailable = WatchUi.loadResource($.Rez.Strings.Unavailable); @@ -178,6 +180,10 @@ class RezStrings { return strTrailingSlashErr; } + static function getWebhookFailed() as Lang.String { + return strWebhookFailed; + } + static function getAvailable() as Lang.String { return strAvailable; } diff --git a/source/WebhookManager.mc b/source/WebhookManager.mc index 687f908..ead1da5 100644 --- a/source/WebhookManager.mc +++ b/source/WebhookManager.mc @@ -2,38 +2,88 @@ using Toybox.Lang; using Toybox.Communications; using Toybox.System; +// Can use push view so must never be run in a glance context class WebhookManager { function onReturnRequestWebhookId(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { - // TODO: Handle errors - if (responseCode == 201) { - var id = data.get("webhook_id") as Lang.String or Null; - if (id != null) { - Settings.setWebhookId(id); - registerWebhookSensor({ - "device_class" => "battery", - "name" => "Battery Level", - "state" => System.getSystemStats().battery, - "type" => "sensor", - "unique_id" => "battery_level", - "unit_of_measurement" => "%", - "state_class" => "measurement", - "entity_category" => "diagnostic", - "disabled" => false - }); - registerWebhookSensor({ - "device_class" => "battery_charging", - "name" => "Battery is Charging", - "state" => System.getSystemStats().charging, - "type" => "binary_sensor", - "unique_id" => "battery_is_charging", - "entity_category" => "diagnostic", - "disabled" => false - }); - } - } else { - if (Globals.scDebug) { - System.println("WebhookManager onReturnRequestWebhookId(): Error: " + responseCode); - } + switch (responseCode) { + case Communications.BLE_HOST_TIMEOUT: + case Communications.BLE_CONNECTION_UNAVAILABLE: + if (Globals.scDebug) { + System.println("WebhookManager onReturnRequestWebhookId() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed."); + } + ErrorView.show(RezStrings.getWebhookFailed()+ "\n" + RezStrings.getNoPhone() + "."); + break; + + case Communications.BLE_QUEUE_FULL: + if (Globals.scDebug) { + System.println("WebhookManager onReturnRequestWebhookId() Response Code: BLE_QUEUE_FULL, API calls too rapid."); + } + ErrorView.show(RezStrings.getWebhookFailed()+ "\n" + RezStrings.getApiFlood()); + break; + + case Communications.NETWORK_REQUEST_TIMED_OUT: + if (Globals.scDebug) { + System.println("WebhookManager onReturnRequestWebhookId() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection."); + } + ErrorView.show(RezStrings.getWebhookFailed()+ "\n" + RezStrings.getNoResponse()); + break; + + case Communications.NETWORK_RESPONSE_OUT_OF_MEMORY: + if (Globals.scDebug) { + System.println("WebhookManager onReturnRequestWebhookId() Response Code: NETWORK_RESPONSE_OUT_OF_MEMORY, are we going too fast?"); + } + // Ignore and see if we can carry on + break; + case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE: + if (Globals.scDebug) { + System.println("WebhookManager onReturnRequestWebhookId() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned."); + } + ErrorView.show(RezStrings.getWebhookFailed()+ "\n" + RezStrings.getNoJson()); + break; + + case 404: + if (Globals.scDebug) { + System.println("WebhookManager onReturnRequestWebhookId() Response Code: 404, page not found. Check API URL setting."); + } + ErrorView.show(RezStrings.getWebhookFailed()+ "\n" + RezStrings.getApiUrlNotFound()); + break; + + case 201: + var id = data.get("webhook_id") as Lang.String or Null; + if (id != null) { + Settings.setWebhookId(id); + registerWebhookSensor({ + "device_class" => "battery", + "name" => "Battery Level", + "state" => System.getSystemStats().battery, + "type" => "sensor", + "unique_id" => "battery_level", + "unit_of_measurement" => "%", + "state_class" => "measurement", + "entity_category" => "diagnostic", + "disabled" => false + }); + registerWebhookSensor({ + "device_class" => "battery_charging", + "name" => "Battery is Charging", + "state" => System.getSystemStats().charging, + "type" => "binary_sensor", + "unique_id" => "battery_is_charging", + "entity_category" => "diagnostic", + "disabled" => false + }); + } else { + if (Globals.scDebug) { + System.println("WebhookManager onReturnRequestWebhookId(): No webhook id in response data."); + } + } + break; + + default: + if (Globals.scDebug) { + System.println("WebhookManager onReturnRequestWebhookId(): Unhandled HTTP response code = " + responseCode); + } + ErrorView.show(RezStrings.getWebhookFailed()+ "\n" + RezStrings.getUnhandledHttpErr() + responseCode); } }