diff --git a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java b/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java index dcf7a0acac22..a6017e396c63 100644 --- a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java +++ b/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java @@ -9,6 +9,7 @@ import android.os.Looper; import androidx.annotation.NonNull; 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.FirebaseOptions; @@ -103,128 +104,183 @@ private Map firebaseOptionsToMap(FirebaseOptions options) { } private Task> firebaseAppToMap(FirebaseApp firebaseApp) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - Map appMap = new HashMap<>(); + try { + Map appMap = new HashMap<>(); - appMap.put(KEY_NAME, firebaseApp.getName()); - appMap.put(KEY_OPTIONS, firebaseOptionsToMap(firebaseApp.getOptions())); + appMap.put(KEY_NAME, firebaseApp.getName()); + appMap.put(KEY_OPTIONS, firebaseOptionsToMap(firebaseApp.getOptions())); - appMap.put( - KEY_IS_AUTOMATIC_DATA_COLLECTION_ENABLED, - firebaseApp.isDataCollectionDefaultEnabled()); - appMap.put( - KEY_PLUGIN_CONSTANTS, - Tasks.await( - FlutterFirebasePluginRegistry.getPluginConstantsForFirebaseApp(firebaseApp))); + appMap.put( + KEY_IS_AUTOMATIC_DATA_COLLECTION_ENABLED, + firebaseApp.isDataCollectionDefaultEnabled()); + appMap.put( + KEY_PLUGIN_CONSTANTS, + Tasks.await( + FlutterFirebasePluginRegistry.getPluginConstantsForFirebaseApp(firebaseApp))); - return appMap; + taskCompletionSource.setResult(appMap); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task> initializeApp(Map arguments) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - String name = (String) Objects.requireNonNull(arguments.get(KEY_APP_NAME)); - - @SuppressWarnings("unchecked") - Map optionsMap = - (Map) Objects.requireNonNull(arguments.get(KEY_OPTIONS)); - - FirebaseOptions options = - new FirebaseOptions.Builder() - .setApiKey(Objects.requireNonNull(optionsMap.get(KEY_API_KEY))) - .setApplicationId(Objects.requireNonNull(optionsMap.get(KEY_APP_ID))) - .setDatabaseUrl(optionsMap.get(KEY_DATABASE_URL)) - .setGcmSenderId(optionsMap.get(KEY_MESSAGING_SENDER_ID)) - .setProjectId(optionsMap.get(KEY_PROJECT_ID)) - .setStorageBucket(optionsMap.get(KEY_STORAGE_BUCKET)) - .setGaTrackingId(optionsMap.get(KEY_TRACKING_ID)) - .build(); - // TODO(Salakar) hacky workaround a bug with FirebaseInAppMessaging causing the error: - // Can't create handler inside thread Thread[pool-3-thread-1,5,main] that has not called Looper.prepare() - // at com.google.firebase.inappmessaging.internal.ForegroundNotifier.(ForegroundNotifier.java:61) try { - Looper.prepare(); + String name = (String) Objects.requireNonNull(arguments.get(KEY_APP_NAME)); + + @SuppressWarnings("unchecked") + Map optionsMap = + (Map) Objects.requireNonNull(arguments.get(KEY_OPTIONS)); + + FirebaseOptions options = + new FirebaseOptions.Builder() + .setApiKey(Objects.requireNonNull(optionsMap.get(KEY_API_KEY))) + .setApplicationId(Objects.requireNonNull(optionsMap.get(KEY_APP_ID))) + .setDatabaseUrl(optionsMap.get(KEY_DATABASE_URL)) + .setGcmSenderId(optionsMap.get(KEY_MESSAGING_SENDER_ID)) + .setProjectId(optionsMap.get(KEY_PROJECT_ID)) + .setStorageBucket(optionsMap.get(KEY_STORAGE_BUCKET)) + .setGaTrackingId(optionsMap.get(KEY_TRACKING_ID)) + .build(); + // TODO(Salakar) hacky workaround a bug with FirebaseInAppMessaging causing the error: + // Can't create handler inside thread Thread[pool-3-thread-1,5,main] that has not called Looper.prepare() + // at com.google.firebase.inappmessaging.internal.ForegroundNotifier.(ForegroundNotifier.java:61) + try { + Looper.prepare(); + } catch (Exception e) { + // do nothing + } + FirebaseApp firebaseApp = FirebaseApp.initializeApp(applicationContext, options, name); + taskCompletionSource.setResult(Tasks.await(firebaseAppToMap(firebaseApp))); } catch (Exception e) { - // do nothing + taskCompletionSource.setException(e); } - FirebaseApp firebaseApp = FirebaseApp.initializeApp(applicationContext, options, name); - return Tasks.await(firebaseAppToMap(firebaseApp)); }); + + return taskCompletionSource.getTask(); } private Task>> initializeCore() { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource>> taskCompletionSource = + new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - if (!coreInitialized) { - coreInitialized = true; - } else { - Tasks.await(FlutterFirebasePluginRegistry.didReinitializeFirebaseCore()); - } + try { + if (!coreInitialized) { + coreInitialized = true; + } else { + Tasks.await(FlutterFirebasePluginRegistry.didReinitializeFirebaseCore()); + } - List firebaseApps = FirebaseApp.getApps(applicationContext); - List> firebaseAppsList = new ArrayList<>(firebaseApps.size()); + List firebaseApps = FirebaseApp.getApps(applicationContext); + List> firebaseAppsList = new ArrayList<>(firebaseApps.size()); - for (FirebaseApp firebaseApp : firebaseApps) { - firebaseAppsList.add(Tasks.await(firebaseAppToMap(firebaseApp))); - } + for (FirebaseApp firebaseApp : firebaseApps) { + firebaseAppsList.add(Tasks.await(firebaseAppToMap(firebaseApp))); + } - return firebaseAppsList; + taskCompletionSource.setResult(firebaseAppsList); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task> firebaseOptionsFromResource() { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - final FirebaseOptions options = FirebaseOptions.fromResource(applicationContext); - if (options == null) return null; - return firebaseOptionsToMap(options); + try { + final FirebaseOptions options = FirebaseOptions.fromResource(applicationContext); + if (options == null) { + taskCompletionSource.setResult(null); + return; + } + taskCompletionSource.setResult(firebaseOptionsToMap(options)); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task setAutomaticDataCollectionEnabled(Map arguments) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - String appName = (String) Objects.requireNonNull(arguments.get(KEY_APP_NAME)); - Boolean enabled = (Boolean) Objects.requireNonNull(arguments.get(KEY_ENABLED)); - FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); - firebaseApp.setDataCollectionDefaultEnabled(enabled); - return null; + try { + String appName = (String) Objects.requireNonNull(arguments.get(KEY_APP_NAME)); + Boolean enabled = (Boolean) Objects.requireNonNull(arguments.get(KEY_ENABLED)); + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); + firebaseApp.setDataCollectionDefaultEnabled(enabled); + + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task setAutomaticResourceManagementEnabled(Map arguments) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - String appName = (String) Objects.requireNonNull(arguments.get(KEY_APP_NAME)); - boolean enabled = (boolean) Objects.requireNonNull(arguments.get(KEY_ENABLED)); - FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); - firebaseApp.setAutomaticResourceManagementEnabled(enabled); - return null; + try { + String appName = (String) Objects.requireNonNull(arguments.get(KEY_APP_NAME)); + boolean enabled = (boolean) Objects.requireNonNull(arguments.get(KEY_ENABLED)); + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); + firebaseApp.setAutomaticResourceManagementEnabled(enabled); + + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } private Task deleteApp(Map arguments) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - String appName = (String) Objects.requireNonNull(arguments.get(KEY_APP_NAME)); - FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); try { - firebaseApp.delete(); - } catch (IllegalStateException appNotFoundException) { - // Ignore app not found exceptions. + String appName = (String) Objects.requireNonNull(arguments.get(KEY_APP_NAME)); + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); + try { + firebaseApp.delete(); + } catch (IllegalStateException appNotFoundException) { + // Ignore app not found exceptions. + } + + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); } - - return null; }); + + return taskCompletionSource.getTask(); } @Override diff --git a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.java b/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.java index 3e6395efc9e5..84fdbc7ce279 100644 --- a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.java +++ b/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.java @@ -7,6 +7,7 @@ import androidx.annotation.Keep; 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 java.util.HashMap; @@ -40,20 +41,27 @@ public static void registerPlugin( * key) for the provided Firebase App. */ static Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - Map pluginConstants = new HashMap<>(registeredPlugins.size()); + try { + Map pluginConstants = new HashMap<>(registeredPlugins.size()); - for (Map.Entry entry : registeredPlugins.entrySet()) { - String channelName = entry.getKey(); - FlutterFirebasePlugin plugin = entry.getValue(); - pluginConstants.put( - channelName, Tasks.await(plugin.getPluginConstantsForFirebaseApp(firebaseApp))); - } + for (Map.Entry entry : registeredPlugins.entrySet()) { + String channelName = entry.getKey(); + FlutterFirebasePlugin plugin = entry.getValue(); + pluginConstants.put( + channelName, Tasks.await(plugin.getPluginConstantsForFirebaseApp(firebaseApp))); + } - return pluginConstants; + taskCompletionSource.setResult(pluginConstants); + } catch (Exception e) { + taskCompletionSource.setException(e); + } }); + + return taskCompletionSource.getTask(); } /** @@ -64,14 +72,22 @@ static Task> getPluginConstantsForFirebaseApp(FirebaseApp fi * Restarts as `initializeCore` can only be called once in Dart. */ static Task didReinitializeFirebaseCore() { - return Tasks.call( - cachedThreadPool, + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( () -> { - for (Map.Entry entry : registeredPlugins.entrySet()) { - FlutterFirebasePlugin plugin = entry.getValue(); - Tasks.await(plugin.didReinitializeFirebaseCore()); + try { + for (Map.Entry entry : registeredPlugins.entrySet()) { + FlutterFirebasePlugin plugin = entry.getValue(); + Tasks.await(plugin.didReinitializeFirebaseCore()); + } + + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); } - return null; }); + + return taskCompletionSource.getTask(); } }