diff --git a/android/app/src/main/java/com/keyboardcrumbs/hassclient/MainActivity.java b/android/app/src/main/java/com/keyboardcrumbs/hassclient/MainActivity.java index e3e25f8..a187a8c 100644 --- a/android/app/src/main/java/com/keyboardcrumbs/hassclient/MainActivity.java +++ b/android/app/src/main/java/com/keyboardcrumbs/hassclient/MainActivity.java @@ -35,7 +35,7 @@ public class MainActivity extends FlutterActivity { Context context = getActivity(); SharedPreferences.Editor editor = context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE).edit(); String token = task.getResult().getToken(); - editor.putString("flutter.fcm-token", token); + editor.putString("flutter.push-token", token); editor.commit(); } } diff --git a/lib/managers/app_settings.dart b/lib/managers/app_settings.dart index a7dc289..3b7d030 100644 --- a/lib/managers/app_settings.dart +++ b/lib/managers/app_settings.dart @@ -20,7 +20,6 @@ class AppSettings { String tempToken; String oauthUrl; String webhookId; - String fcmToken; double haVersion; bool scrollBadges; AppTheme appTheme; @@ -40,7 +39,6 @@ class AppSettings { if (full) { Logger.d('Loading settings...'); SharedPreferences prefs = await SharedPreferences.getInstance(); - fcmToken = prefs.getString('fcm-token'); _domain = prefs.getString('hassio-domain'); _port = prefs.getString('hassio-port'); webhookId = prefs.getString('app-webhook-id'); @@ -69,6 +67,11 @@ class AppSettings { } } + Future loadSingle(String key) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + return prefs.get('$key'); + } + Future save(Map settings) async { if (settings != null && settings.isNotEmpty) { SharedPreferences prefs = await SharedPreferences.getInstance(); diff --git a/lib/managers/mobile_app_integration_manager.class.dart b/lib/managers/mobile_app_integration_manager.class.dart index 72f6b79..488a694 100644 --- a/lib/managers/mobile_app_integration_manager.class.dart +++ b/lib/managers/mobile_app_integration_manager.class.dart @@ -24,94 +24,95 @@ class MobileAppIntegrationManager { static Future checkAppRegistration() { Completer completer = Completer(); _appRegistrationData["device_name"] = AppSettings().mobileAppDeviceName ?? getDefaultDeviceName(); - (_appRegistrationData["app_data"] as Map)["push_token"] = "${AppSettings().fcmToken}"; - if (AppSettings().webhookId == null) { - Logger.d("Mobile app was not registered yet. Registering..."); - var registrationData = Map.from(_appRegistrationData); - registrationData.addAll({ - "app_id": "ha_client", - "app_name": "$appName", - "os_name": DeviceInfoManager().osName, - "supports_encryption": false, - }); - if (AppSettings().haVersion >= 104) { + AppSettings().loadSingle('push-token').then((fcmToken) { + (_appRegistrationData["app_data"] as Map)["push_token"] = "$fcmToken"; + if (AppSettings().webhookId == null) { + Logger.d("Mobile app was not registered yet. Registering..."); + var registrationData = Map.from(_appRegistrationData); registrationData.addAll({ - "device_id": "${DeviceInfoManager().unicDeviceId}" + "app_id": "ha_client", + "app_name": "$appName", + "os_name": DeviceInfoManager().osName, + "supports_encryption": false, + }); + if (AppSettings().haVersion >= 104) { + registrationData.addAll({ + "device_id": "${DeviceInfoManager().unicDeviceId}" + }); + } + ConnectionManager().sendHTTPPost( + endPoint: "/api/mobile_app/registrations", + includeAuthHeader: true, + data: json.encode(registrationData) + ).then((response) { + Logger.d("Processing registration responce..."); + var responseObject = json.decode(response); + AppSettings().webhookId = responseObject["webhook_id"]; + AppSettings().save({ + 'app-webhook-id': responseObject["webhook_id"] + }).then((prefs) { + completer.complete(); + eventBus.fire(ShowPopupEvent( + popup: Popup( + title: "Mobile app Integration was created", + body: "HA Client was registered as MobileApp in your Home Assistant. To start using notifications you need to restart your Home Assistant", + positiveText: "Restart now", + negativeText: "Later", + onPositive: () { + ConnectionManager().callService(domain: "homeassistant", service: "restart"); + }, + ) + )); + }); + }).catchError((e) { + completer.complete(); + if (e is http.Response) { + Logger.e("Error registering the app: ${e.statusCode}: ${e.body}"); + } else { + Logger.e("Error registering the app: ${e?.toString()}"); + } + _showError(); + }); + } else { + Logger.d("App was previously registered. Checking..."); + var updateData = { + "type": "update_registration", + "data": _appRegistrationData + }; + ConnectionManager().sendHTTPPost( + endPoint: "/api/webhook/${AppSettings().webhookId}", + includeAuthHeader: false, + data: json.encode(updateData) + ).then((response) { + var registrationData; + try { + registrationData = json.decode(response); + } catch (e) { + registrationData = null; + } + if (registrationData == null || registrationData.isEmpty) { + Logger.w("No registration data in response. MobileApp integration was removed or broken"); + _askToRegisterApp(); + } else { + Logger.d('App registration works fine'); + } + completer.complete(); + }).catchError((e) { + if (e is http.Response && e.statusCode == 410) { + Logger.w("MobileApp integration was removed"); + _askToRegisterApp(); + } else if (e is http.Response) { + Logger.w("Error updating app registration: ${e.statusCode}: ${e.body}"); + _showError(); + } else { + Logger.w("Error updating app registration: ${e?.toString()}"); + _showError(); + } + completer.complete(); }); } - ConnectionManager().sendHTTPPost( - endPoint: "/api/mobile_app/registrations", - includeAuthHeader: true, - data: json.encode(registrationData) - ).then((response) { - Logger.d("Processing registration responce..."); - var responseObject = json.decode(response); - AppSettings().webhookId = responseObject["webhook_id"]; - AppSettings().save({ - 'app-webhook-id': responseObject["webhook_id"] - }).then((prefs) { - completer.complete(); - eventBus.fire(ShowPopupEvent( - popup: Popup( - title: "Mobile app Integration was created", - body: "HA Client was registered as MobileApp in your Home Assistant. To start using notifications you need to restart your Home Assistant", - positiveText: "Restart now", - negativeText: "Later", - onPositive: () { - ConnectionManager().callService(domain: "homeassistant", service: "restart"); - }, - ) - )); - }); - }).catchError((e) { - completer.complete(); - if (e is http.Response) { - Logger.e("Error registering the app: ${e.statusCode}: ${e.body}"); - } else { - Logger.e("Error registering the app: ${e?.toString()}"); - } - _showError(); - }); - return completer.future; - } else { - Logger.d("App was previously registered. Checking..."); - var updateData = { - "type": "update_registration", - "data": _appRegistrationData - }; - ConnectionManager().sendHTTPPost( - endPoint: "/api/webhook/${AppSettings().webhookId}", - includeAuthHeader: false, - data: json.encode(updateData) - ).then((response) { - var registrationData; - try { - registrationData = json.decode(response); - } catch (e) { - registrationData = null; - } - if (registrationData == null || registrationData.isEmpty) { - Logger.w("No registration data in response. MobileApp integration was removed or broken"); - _askToRegisterApp(); - } else { - Logger.d('App registration works fine'); - } - completer.complete(); - }).catchError((e) { - if (e is http.Response && e.statusCode == 410) { - Logger.w("MobileApp integration was removed"); - _askToRegisterApp(); - } else if (e is http.Response) { - Logger.w("Error updating app registration: ${e.statusCode}: ${e.body}"); - _showError(); - } else { - Logger.w("Error updating app registration: ${e?.toString()}"); - _showError(); - } - completer.complete(); - }); - return completer.future; - } + }); + return completer.future; } static void _showError() {