From 0510d113dd279d6f55d889e522e74781d8fbb845 Mon Sep 17 00:00:00 2001 From: Russell Wheatley Date: Tue, 26 Apr 2022 15:22:34 +0100 Subject: [PATCH] refactor(firebase_messaging): Remove deprecated `Tasks.call()` API from android. (#8449) --- .../FlutterFirebaseMessagingPlugin.java | 273 +++++++++++------- .../example/android/app/build.gradle | 4 +- 2 files changed, 178 insertions(+), 99 deletions(-) diff --git a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingPlugin.java b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingPlugin.java index c66170e3c40b..b7e3ccc033df 100644 --- a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingPlugin.java +++ b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingPlugin.java @@ -16,6 +16,7 @@ import androidx.core.app.NotificationManagerCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.TaskCompletionSource; import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; import com.google.firebase.messaging.FirebaseMessaging; @@ -126,141 +127,207 @@ public void onReceive(Context context, Intent intent) { } private Task deleteToken() { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - Tasks.await(FirebaseMessaging.getInstance().deleteToken()); - return null; + try { + Tasks.await(FirebaseMessaging.getInstance().deleteToken()); + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task> getToken() { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - String token = Tasks.await(FirebaseMessaging.getInstance().getToken()); - return new HashMap() { - { - put("token", token); - } - }; + try { + String token = Tasks.await(FirebaseMessaging.getInstance().getToken()); + taskCompletionSource.setResult( + new HashMap() { + { + put("token", token); + } + }); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task subscribeToTopic(Map arguments) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - FirebaseMessaging firebaseMessaging = - FlutterFirebaseMessagingUtils.getFirebaseMessagingForArguments(arguments); - String topic = (String) Objects.requireNonNull(arguments.get("topic")); - Tasks.await(firebaseMessaging.subscribeToTopic(topic)); - return null; + try { + FirebaseMessaging firebaseMessaging = + FlutterFirebaseMessagingUtils.getFirebaseMessagingForArguments(arguments); + String topic = (String) Objects.requireNonNull(arguments.get("topic")); + Tasks.await(firebaseMessaging.subscribeToTopic(topic)); + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task unsubscribeFromTopic(Map arguments) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - FirebaseMessaging firebaseMessaging = - FlutterFirebaseMessagingUtils.getFirebaseMessagingForArguments(arguments); - String topic = (String) Objects.requireNonNull(arguments.get("topic")); - Tasks.await(firebaseMessaging.unsubscribeFromTopic(topic)); - return null; + try { + FirebaseMessaging firebaseMessaging = + FlutterFirebaseMessagingUtils.getFirebaseMessagingForArguments(arguments); + String topic = (String) Objects.requireNonNull(arguments.get("topic")); + Tasks.await(firebaseMessaging.unsubscribeFromTopic(topic)); + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task sendMessage(Map arguments) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - FirebaseMessaging firebaseMessaging = - FlutterFirebaseMessagingUtils.getFirebaseMessagingForArguments(arguments); - RemoteMessage remoteMessage = - FlutterFirebaseMessagingUtils.getRemoteMessageForArguments(arguments); - firebaseMessaging.send(remoteMessage); - return null; + try { + FirebaseMessaging firebaseMessaging = + FlutterFirebaseMessagingUtils.getFirebaseMessagingForArguments(arguments); + RemoteMessage remoteMessage = + FlutterFirebaseMessagingUtils.getRemoteMessageForArguments(arguments); + firebaseMessaging.send(remoteMessage); + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task> setAutoInitEnabled(Map arguments) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - FirebaseMessaging firebaseMessaging = - FlutterFirebaseMessagingUtils.getFirebaseMessagingForArguments(arguments); - Boolean enabled = (Boolean) Objects.requireNonNull(arguments.get("enabled")); - firebaseMessaging.setAutoInitEnabled(enabled); - return new HashMap() { - { - put( - FlutterFirebaseMessagingUtils.IS_AUTO_INIT_ENABLED, - firebaseMessaging.isAutoInitEnabled()); - } - }; + try { + FirebaseMessaging firebaseMessaging = + FlutterFirebaseMessagingUtils.getFirebaseMessagingForArguments(arguments); + Boolean enabled = (Boolean) Objects.requireNonNull(arguments.get("enabled")); + firebaseMessaging.setAutoInitEnabled(enabled); + taskCompletionSource.setResult( + new HashMap() { + { + put( + FlutterFirebaseMessagingUtils.IS_AUTO_INIT_ENABLED, + firebaseMessaging.isAutoInitEnabled()); + } + }); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task> getInitialMessage(Map arguments) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - if (initialMessage != null) { - Map remoteMessageMap = - FlutterFirebaseMessagingUtils.remoteMessageToMap(initialMessage); - initialMessage = null; - return remoteMessageMap; - } + try { + if (initialMessage != null) { + Map remoteMessageMap = + FlutterFirebaseMessagingUtils.remoteMessageToMap(initialMessage); + initialMessage = null; + taskCompletionSource.setResult(remoteMessageMap); + return; + } - if (mainActivity == null) { - return null; - } + if (mainActivity == null) { + taskCompletionSource.setResult(null); + return; + } - Intent intent = mainActivity.getIntent(); + Intent intent = mainActivity.getIntent(); - if (intent == null || intent.getExtras() == null) { - return null; - } + if (intent == null || intent.getExtras() == null) { + taskCompletionSource.setResult(null); + return; + } - // Remote Message ID can be either one of the following... - String messageId = intent.getExtras().getString("google.message_id"); - if (messageId == null) messageId = intent.getExtras().getString("message_id"); + // Remote Message ID can be either one of the following... + String messageId = intent.getExtras().getString("google.message_id"); + if (messageId == null) messageId = intent.getExtras().getString("message_id"); - // We only want to handle non-consumed initial messages. - if (messageId == null || consumedInitialMessages.get(messageId) != null) { - return null; - } + // We only want to handle non-consumed initial messages. + if (messageId == null || consumedInitialMessages.get(messageId) != null) { + taskCompletionSource.setResult(null); + return; + } - RemoteMessage remoteMessage = - FlutterFirebaseMessagingReceiver.notifications.get(messageId); + RemoteMessage remoteMessage = + FlutterFirebaseMessagingReceiver.notifications.get(messageId); - // If we can't find a copy of the remote message in memory then check from our persisted store. - if (remoteMessage == null) { - remoteMessage = - FlutterFirebaseMessagingStore.getInstance().getFirebaseMessage(messageId); - FlutterFirebaseMessagingStore.getInstance().removeFirebaseMessage(messageId); - } + // If we can't find a copy of the remote message in memory then check from our persisted store. + if (remoteMessage == null) { + remoteMessage = + FlutterFirebaseMessagingStore.getInstance().getFirebaseMessage(messageId); + FlutterFirebaseMessagingStore.getInstance().removeFirebaseMessage(messageId); + } - if (remoteMessage == null) { - return null; - } + if (remoteMessage == null) { + taskCompletionSource.setResult(null); + return; + } + + consumedInitialMessages.put(messageId, true); + + taskCompletionSource.setResult( + FlutterFirebaseMessagingUtils.remoteMessageToMap(remoteMessage)); - consumedInitialMessages.put(messageId, true); - return FlutterFirebaseMessagingUtils.remoteMessageToMap(remoteMessage); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task> getPermissions() { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - final Map permissions = new HashMap<>(); - final boolean areNotificationsEnabled = - NotificationManagerCompat.from(mainActivity).areNotificationsEnabled(); - permissions.put("authorizationStatus", areNotificationsEnabled ? 1 : 0); - return permissions; + try { + final Map permissions = new HashMap<>(); + final boolean areNotificationsEnabled = + NotificationManagerCompat.from(mainActivity).areNotificationsEnabled(); + permissions.put("authorizationStatus", areNotificationsEnabled ? 1 : 0); + taskCompletionSource.setResult(permissions); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } @Override @@ -405,20 +472,32 @@ public boolean onNewIntent(Intent intent) { @Override public Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - Map constants = new HashMap<>(); - if (firebaseApp.getName().equals("[DEFAULT]")) { - FirebaseMessaging firebaseMessaging = FirebaseMessaging.getInstance(); - constants.put("AUTO_INIT_ENABLED", firebaseMessaging.isAutoInitEnabled()); + try { + Map constants = new HashMap<>(); + if (firebaseApp.getName().equals("[DEFAULT]")) { + FirebaseMessaging firebaseMessaging = FirebaseMessaging.getInstance(); + constants.put("AUTO_INIT_ENABLED", firebaseMessaging.isAutoInitEnabled()); + } + taskCompletionSource.setResult(constants); + + } catch (Exception e) { + taskCompletionSource.setException(e); } - return constants; }); + + return taskCompletionSource.getTask(); } @Override public Task didReinitializeFirebaseCore() { - return Tasks.call(cachedThreadPool, () -> null); + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute(() -> taskCompletionSource.setResult(null)); + + return taskCompletionSource.getTask(); } } diff --git a/packages/firebase_messaging/firebase_messaging/example/android/app/build.gradle b/packages/firebase_messaging/firebase_messaging/example/android/app/build.gradle index 953f9b84e2f2..81e884bb0580 100644 --- a/packages/firebase_messaging/firebase_messaging/example/android/app/build.gradle +++ b/packages/firebase_messaging/firebase_messaging/example/android/app/build.gradle @@ -25,7 +25,7 @@ apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 29 + compileSdkVersion 31 lintOptions { disable 'InvalidPackage' @@ -35,7 +35,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "io.flutter.plugins.firebase.messaging.example" minSdkVersion 19 - targetSdkVersion 29 + targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName }