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);
}
}