defer fcm token load
This commit is contained in:
		| @@ -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(); | ||||
|                     } | ||||
|                 } | ||||
|   | ||||
| @@ -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<dynamic> loadSingle(String key) async { | ||||
|     SharedPreferences prefs = await SharedPreferences.getInstance(); | ||||
|     return prefs.get('$key'); | ||||
|   } | ||||
|  | ||||
|   Future save(Map<String, dynamic> settings) async { | ||||
|     if (settings != null && settings.isNotEmpty) { | ||||
|       SharedPreferences prefs = await SharedPreferences.getInstance(); | ||||
|   | ||||
| @@ -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() { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user