FCM token update and waiting
This commit is contained in:
		@@ -33,10 +33,9 @@ public class MainActivity extends FlutterActivity {
 | 
				
			|||||||
                public void onComplete(@NonNull Task<InstanceIdResult> task) {
 | 
					                public void onComplete(@NonNull Task<InstanceIdResult> task) {
 | 
				
			||||||
                    if (task.isSuccessful()) {
 | 
					                    if (task.isSuccessful()) {
 | 
				
			||||||
                        Context context = getActivity();
 | 
					                        Context context = getActivity();
 | 
				
			||||||
                        SharedPreferences.Editor editor = context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE).edit();
 | 
					 | 
				
			||||||
                        String token = task.getResult().getToken();
 | 
					                        String token = task.getResult().getToken();
 | 
				
			||||||
                        editor.putString("flutter.push-token", token);
 | 
					                        UpdateTokenTask updateTokenTask = new UpdateTokenTask(context);
 | 
				
			||||||
                        editor.commit();
 | 
					                        updateTokenTask.execute(token);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,7 +40,8 @@ public class MessagingService extends FirebaseMessagingService {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void onNewToken(String token) {
 | 
					    public void onNewToken(String token) {
 | 
				
			||||||
        //TODO update token
 | 
					        UpdateTokenTask updateTokenTask = new UpdateTokenTask(this);
 | 
				
			||||||
 | 
					        updateTokenTask.execute(token);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void sendNotification(Map<String, String> data) {
 | 
					    private void sendNotification(Map<String, String> data) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					package com.keyboardcrumbs.hassclient;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.util.Log;
 | 
				
			||||||
 | 
					import android.os.AsyncTask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.net.URL;
 | 
				
			||||||
 | 
					import java.net.HttpURLConnection;
 | 
				
			||||||
 | 
					import java.io.OutputStream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.webkit.URLUtil;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.json.JSONObject;
 | 
				
			||||||
 | 
					import android.content.SharedPreferences;
 | 
				
			||||||
 | 
					import android.content.Context;
 | 
				
			||||||
 | 
					import java.lang.ref.WeakReference;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class UpdateTokenTask extends AsyncTask<String, String, String> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final String TAG = "UpdateTokenTask";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private WeakReference<Context> contextRef;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public UpdateTokenTask(Context context){
 | 
				
			||||||
 | 
					        contextRef = new WeakReference<>(context);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected void onPreExecute() {
 | 
				
			||||||
 | 
					        super.onPreExecute();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected String doInBackground(String... params) {
 | 
				
			||||||
 | 
					        Log.d(TAG, "Updating push token");
 | 
				
			||||||
 | 
					        Context context = contextRef.get();
 | 
				
			||||||
 | 
					        if (context != null) {
 | 
				
			||||||
 | 
					            String token = params[0];
 | 
				
			||||||
 | 
					            SharedPreferences prefs = context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE);
 | 
				
			||||||
 | 
					            SharedPreferences.Editor editor = prefs.edit();
 | 
				
			||||||
 | 
					            editor.putString("flutter.notification-token", token);
 | 
				
			||||||
 | 
					            editor.commit();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -21,10 +21,31 @@ class MobileAppIntegrationManager {
 | 
				
			|||||||
    return '${HomeAssistant().userName}\'s ${DeviceInfoManager().model}';
 | 
					    return '${HomeAssistant().userName}\'s ${DeviceInfoManager().model}';
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static Future checkAppRegistration() {
 | 
					  static Future checkAppRegistration() async {
 | 
				
			||||||
 | 
					    int attempts = 1;
 | 
				
			||||||
 | 
					    bool done = false;
 | 
				
			||||||
 | 
					    Logger.d("[MobileAppIntegrationManager] Stratring mobile app integration check...");
 | 
				
			||||||
 | 
					    while (attempts <= 5 && !done) {
 | 
				
			||||||
 | 
					      Logger.d("[MobileAppIntegrationManager] check attempt $attempts");
 | 
				
			||||||
 | 
					      String fcmToken = await AppSettings().loadSingle('notification-token');
 | 
				
			||||||
 | 
					      if (fcmToken != null) {
 | 
				
			||||||
 | 
					        Logger.d("[MobileAppIntegrationManager] token exist");
 | 
				
			||||||
 | 
					        await _doCheck(fcmToken);
 | 
				
			||||||
 | 
					        done = true;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        Logger.d("[MobileAppIntegrationManager] no fcm token. Retry in 5 seconds");
 | 
				
			||||||
 | 
					        attempts++;
 | 
				
			||||||
 | 
					        await Future.delayed(Duration(seconds: 5));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!done) {
 | 
				
			||||||
 | 
					      Logger.e("[MobileAppIntegrationManager] No FCM token");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static Future _doCheck(String fcmToken) {
 | 
				
			||||||
    Completer completer = Completer();
 | 
					    Completer completer = Completer();
 | 
				
			||||||
    _appRegistrationData["device_name"] = AppSettings().mobileAppDeviceName ?? getDefaultDeviceName();
 | 
					    _appRegistrationData["device_name"] = AppSettings().mobileAppDeviceName ?? getDefaultDeviceName();
 | 
				
			||||||
    AppSettings().loadSingle('push-token').then((fcmToken) {
 | 
					 | 
				
			||||||
    (_appRegistrationData["app_data"] as Map)["push_token"] = "$fcmToken";
 | 
					    (_appRegistrationData["app_data"] as Map)["push_token"] = "$fcmToken";
 | 
				
			||||||
    if (AppSettings().webhookId == null) {
 | 
					    if (AppSettings().webhookId == null) {
 | 
				
			||||||
      Logger.d("Mobile app was not registered yet. Registering...");
 | 
					      Logger.d("Mobile app was not registered yet. Registering...");
 | 
				
			||||||
@@ -111,7 +132,6 @@ class MobileAppIntegrationManager {
 | 
				
			|||||||
        completer.complete();
 | 
					        completer.complete();
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    return completer.future;
 | 
					    return completer.future;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user