From 8d4cb8ba2e76db043e1f3718b3be08cebbdd7be0 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Wed, 29 Oct 2025 13:48:43 +0000 Subject: [PATCH 01/17] refactor(core): Refactor Java and Objc to Kotlin and Swift --- .../firebase_core/android/build.gradle | 10 + .../core/FlutterFirebaseCorePlugin.java | 302 ------ .../core/FlutterFirebaseCoreRegistrar.java | 21 - .../firebase/core/FlutterFirebasePlugin.java | 35 - .../core/FlutterFirebasePluginRegistry.java | 93 -- .../core/GeneratedAndroidFirebaseCore.java | 906 ------------------ .../core/FlutterFirebaseCorePlugin.kt | 198 ++++ .../core/FlutterFirebaseCoreRegistrar.kt | 20 + .../firebase/core/FlutterFirebasePlugin.kt | 38 + .../core/FlutterFirebasePluginRegistry.kt | 87 ++ .../core/GeneratedAndroidFirebaseCore.kt | 370 +++++++ .../example/android/app/build.gradle | 2 +- .../firebase_core/ios/firebase_core.podspec | 5 +- .../firebase_core/FLTFirebaseCorePlugin.m | 257 ----- .../firebase_core/FLTFirebaseCorePlugin.swift | 232 +++++ .../Sources/firebase_core/FLTFirebasePlugin.m | 63 -- .../firebase_core/FLTFirebasePlugin.swift | 125 +++ .../firebase_core/FLTFirebasePluginRegistry.m | 79 -- .../FLTFirebasePluginRegistry.swift | 86 ++ .../Sources/firebase_core/dummy.m | 3 - .../include/firebase_core/.gitkeep | 0 .../firebase_core/FLTFirebaseCorePlugin.h | 24 - .../include/firebase_core/FLTFirebasePlugin.h | 168 ---- .../firebase_core/FLTFirebasePluginRegistry.h | 48 - .../include/firebase_core/dummy.h | 3 - .../include/firebase_core/messages.g.h | 103 -- .../Sources/firebase_core/messages.g.m | 389 -------- .../Sources/firebase_core/messages.g.swift | 420 ++++++++ .../firebase_core/macos/firebase_core.podspec | 5 +- .../lib/src/pigeon/messages.pigeon.dart | 110 +-- .../lib/src/pigeon/test_api.dart | 176 ++-- .../pigeons/messages.dart | 14 +- 32 files changed, 1699 insertions(+), 2693 deletions(-) delete mode 100644 packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java delete mode 100644 packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCoreRegistrar.java delete mode 100644 packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePlugin.java delete mode 100644 packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.java delete mode 100644 packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.java create mode 100644 packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.kt create mode 100644 packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebaseCoreRegistrar.kt create mode 100644 packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebasePlugin.kt create mode 100644 packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.kt create mode 100644 packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.kt delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m create mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m create mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m create mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/dummy.m delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/.gitkeep delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/dummy.h delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h delete mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.m create mode 100644 packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.swift diff --git a/packages/firebase_core/firebase_core/android/build.gradle b/packages/firebase_core/firebase_core/android/build.gradle index 33904fddc266..45530450e816 100644 --- a/packages/firebase_core/firebase_core/android/build.gradle +++ b/packages/firebase_core/firebase_core/android/build.gradle @@ -2,13 +2,18 @@ group 'io.flutter.plugins.firebase.core' version '1.0-SNAPSHOT' apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' apply from: file("local-config.gradle") buildscript { + ext.kotlin_version = '1.9.10' repositories { google() mavenCentral() } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } } def getRootProjectExtOrDefaultProperty(name) { @@ -36,6 +41,10 @@ android { targetCompatibility project.ext.javaVersion } + kotlinOptions { + jvmTarget = project.ext.javaVersion + } + buildFeatures { buildConfig true } @@ -49,6 +58,7 @@ android { implementation "com.google.firebase:firebase-common" implementation 'androidx.annotation:annotation:1.7.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } } 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 deleted file mode 100644 index 53b7e6356457..000000000000 --- a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -package io.flutter.plugins.firebase.core; - -import static io.flutter.plugins.firebase.core.FlutterFirebasePlugin.cachedThreadPool; - -import android.content.Context; -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; -import io.flutter.embedding.engine.plugins.FlutterPlugin; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Flutter plugin implementation controlling the entrypoint for the Firebase SDK. - * - *

Instantiate this in an add to app scenario to gracefully handle activity and context changes. - */ -public class FlutterFirebaseCorePlugin - implements FlutterPlugin, - GeneratedAndroidFirebaseCore.FirebaseCoreHostApi, - GeneratedAndroidFirebaseCore.FirebaseAppHostApi { - private Context applicationContext; - private boolean coreInitialized = false; - - public static Map customAuthDomain = new HashMap<>(); - - @Override - public void onAttachedToEngine(FlutterPluginBinding binding) { - GeneratedAndroidFirebaseCore.FirebaseCoreHostApi.setUp(binding.getBinaryMessenger(), this); - GeneratedAndroidFirebaseCore.FirebaseAppHostApi.setUp(binding.getBinaryMessenger(), this); - applicationContext = binding.getApplicationContext(); - } - - @Override - public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { - applicationContext = null; - GeneratedAndroidFirebaseCore.FirebaseCoreHostApi.setUp(binding.getBinaryMessenger(), null); - GeneratedAndroidFirebaseCore.FirebaseAppHostApi.setUp(binding.getBinaryMessenger(), null); - } - - private GeneratedAndroidFirebaseCore.CoreFirebaseOptions firebaseOptionsToMap( - FirebaseOptions options) { - GeneratedAndroidFirebaseCore.CoreFirebaseOptions.Builder firebaseOptions = - new GeneratedAndroidFirebaseCore.CoreFirebaseOptions.Builder(); - - firebaseOptions.setApiKey(options.getApiKey()); - firebaseOptions.setAppId(options.getApplicationId()); - if (options.getGcmSenderId() != null) { - firebaseOptions.setMessagingSenderId(options.getGcmSenderId()); - } - if (options.getProjectId() != null) { - firebaseOptions.setProjectId(options.getProjectId()); - } - firebaseOptions.setDatabaseURL(options.getDatabaseUrl()); - firebaseOptions.setStorageBucket(options.getStorageBucket()); - firebaseOptions.setTrackingId(options.getGaTrackingId()); - - return firebaseOptions.build(); - } - - private Task firebaseAppToMap( - FirebaseApp firebaseApp) { - TaskCompletionSource taskCompletionSource = - new TaskCompletionSource<>(); - - cachedThreadPool.execute( - () -> { - try { - GeneratedAndroidFirebaseCore.CoreInitializeResponse.Builder initializeResponse = - new GeneratedAndroidFirebaseCore.CoreInitializeResponse.Builder(); - - initializeResponse.setName(firebaseApp.getName()); - initializeResponse.setOptions(firebaseOptionsToMap(firebaseApp.getOptions())); - - initializeResponse.setIsAutomaticDataCollectionEnabled( - firebaseApp.isDataCollectionDefaultEnabled()); - initializeResponse.setPluginConstants( - Tasks.await( - FlutterFirebasePluginRegistry.getPluginConstantsForFirebaseApp(firebaseApp))); - - taskCompletionSource.setResult(initializeResponse.build()); - } catch (Exception e) { - taskCompletionSource.setException(e); - } - }); - - return taskCompletionSource.getTask(); - } - - private void listenToResponse( - TaskCompletionSource taskCompletionSource, GeneratedAndroidFirebaseCore.Result result) { - taskCompletionSource - .getTask() - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - result.success(task.getResult()); - } else { - Exception exception = task.getException(); - result.error(exception); - } - }); - } - - private void listenToVoidResponse( - TaskCompletionSource taskCompletionSource, - GeneratedAndroidFirebaseCore.VoidResult result) { - taskCompletionSource - .getTask() - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - result.success(); - } else { - Exception exception = task.getException(); - result.error(exception); - } - }); - } - - @Override - public void initializeApp( - @NonNull String appName, - @NonNull GeneratedAndroidFirebaseCore.CoreFirebaseOptions initializeAppRequest, - GeneratedAndroidFirebaseCore.Result - result) { - TaskCompletionSource taskCompletionSource = - new TaskCompletionSource<>(); - - cachedThreadPool.execute( - () -> { - try { - - FirebaseOptions options = - new FirebaseOptions.Builder() - .setApiKey(initializeAppRequest.getApiKey()) - .setApplicationId(initializeAppRequest.getAppId()) - .setDatabaseUrl(initializeAppRequest.getDatabaseURL()) - .setGcmSenderId(initializeAppRequest.getMessagingSenderId()) - .setProjectId(initializeAppRequest.getProjectId()) - .setStorageBucket(initializeAppRequest.getStorageBucket()) - .setGaTrackingId(initializeAppRequest.getTrackingId()) - .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 - } - - if (initializeAppRequest.getAuthDomain() != null) { - customAuthDomain.put(appName, initializeAppRequest.getAuthDomain()); - } - - FirebaseApp firebaseApp = - FirebaseApp.initializeApp(applicationContext, options, appName); - taskCompletionSource.setResult(Tasks.await(firebaseAppToMap(firebaseApp))); - } catch (Exception e) { - taskCompletionSource.setException(e); - } - }); - - listenToResponse(taskCompletionSource, result); - } - - @Override - public void initializeCore( - GeneratedAndroidFirebaseCore.Result> - result) { - TaskCompletionSource> - taskCompletionSource = new TaskCompletionSource<>(); - - cachedThreadPool.execute( - () -> { - try { - if (!coreInitialized) { - coreInitialized = true; - } else { - Tasks.await(FlutterFirebasePluginRegistry.didReinitializeFirebaseCore()); - } - - List firebaseApps = FirebaseApp.getApps(applicationContext); - List firebaseAppsList = - new ArrayList<>(firebaseApps.size()); - - for (FirebaseApp firebaseApp : firebaseApps) { - firebaseAppsList.add(Tasks.await(firebaseAppToMap(firebaseApp))); - } - - taskCompletionSource.setResult(firebaseAppsList); - } catch (Exception e) { - taskCompletionSource.setException(e); - } - }); - - listenToResponse(taskCompletionSource, result); - } - - @Override - public void optionsFromResource( - GeneratedAndroidFirebaseCore.Result - result) { - TaskCompletionSource taskCompletionSource = - new TaskCompletionSource<>(); - - cachedThreadPool.execute( - () -> { - try { - final FirebaseOptions options = FirebaseOptions.fromResource(applicationContext); - if (options == null) { - taskCompletionSource.setException( - new Exception( - "Failed to load FirebaseOptions from resource. Check that you have defined values.xml correctly.")); - return; - } - taskCompletionSource.setResult(firebaseOptionsToMap(options)); - } catch (Exception e) { - taskCompletionSource.setException(e); - } - }); - - listenToResponse(taskCompletionSource, result); - } - - @Override - public void setAutomaticDataCollectionEnabled( - @NonNull String appName, - @NonNull Boolean enabled, - GeneratedAndroidFirebaseCore.VoidResult result) { - TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); - - cachedThreadPool.execute( - () -> { - try { - FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); - firebaseApp.setDataCollectionDefaultEnabled(enabled); - - taskCompletionSource.setResult(null); - } catch (Exception e) { - taskCompletionSource.setException(e); - } - }); - - listenToVoidResponse(taskCompletionSource, result); - } - - @Override - public void setAutomaticResourceManagementEnabled( - @NonNull String appName, - @NonNull Boolean enabled, - GeneratedAndroidFirebaseCore.VoidResult result) { - TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); - - cachedThreadPool.execute( - () -> { - try { - FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); - firebaseApp.setAutomaticResourceManagementEnabled(enabled); - - taskCompletionSource.setResult(null); - } catch (Exception e) { - taskCompletionSource.setException(e); - } - }); - - listenToVoidResponse(taskCompletionSource, result); - } - - @Override - public void delete(@NonNull String appName, GeneratedAndroidFirebaseCore.VoidResult result) { - TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); - - cachedThreadPool.execute( - () -> { - try { - 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); - } - }); - - listenToVoidResponse(taskCompletionSource, result); - } -} diff --git a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCoreRegistrar.java b/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCoreRegistrar.java deleted file mode 100644 index e12a3795e75f..000000000000 --- a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCoreRegistrar.java +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.core; - -import androidx.annotation.Keep; -import com.google.firebase.components.Component; -import com.google.firebase.components.ComponentRegistrar; -import com.google.firebase.platforminfo.LibraryVersionComponent; -import java.util.Collections; -import java.util.List; - -@Keep -public class FlutterFirebaseCoreRegistrar implements ComponentRegistrar { - @Override - public List> getComponents() { - return Collections.singletonList( - LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); - } -} diff --git a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePlugin.java b/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePlugin.java deleted file mode 100644 index ec31f63e6d62..000000000000 --- a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePlugin.java +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -package io.flutter.plugins.firebase.core; - -import androidx.annotation.Keep; -import com.google.android.gms.tasks.Task; -import com.google.firebase.FirebaseApp; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Keep -public interface FlutterFirebasePlugin { - // A shared ExecutorService used by all FlutterFire Plugins for their GMS Tasks. - ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); - - /** - * FlutterFire plugins implementing FlutterFirebasePlugin must provide this method to provide it's - * constants that are initialized during FirebaseCore.initializeApp in Dart. - * - * @param firebaseApp The Firebase App that the plugin should return constants for. - * @return A task returning the discovered constants for the plugin for the provided Firebase App. - */ - Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp); - - /** - * FlutterFire plugins implementing FlutterFirebasePlugin should provide this method to be - * notified when FirebaseCore#initializeCore was called again (first time is ignored). - * - *

This can be used by plugins to know when they might need to cleanup previous resources - * between Hot Restarts as `initializeCore` can only be called once in Dart. - */ - Task didReinitializeFirebaseCore(); -} 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 deleted file mode 100644 index 84fdbc7ce279..000000000000 --- a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.java +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -package io.flutter.plugins.firebase.core; - -import static io.flutter.plugins.firebase.core.FlutterFirebasePlugin.cachedThreadPool; - -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; -import java.util.Map; -import java.util.WeakHashMap; - -@Keep -public class FlutterFirebasePluginRegistry { - - private static final Map registeredPlugins = new WeakHashMap<>(); - - /** - * Register a Flutter Firebase plugin with the Firebase plugin registry. - * - * @param channelName The MethodChannel name for the plugin to be registered, for example: - * `plugins.flutter.io/firebase_core` - * @param flutterFirebasePlugin A FlutterPlugin that implements FlutterFirebasePlugin. - */ - public static void registerPlugin( - String channelName, FlutterFirebasePlugin flutterFirebasePlugin) { - registeredPlugins.put(channelName, flutterFirebasePlugin); - } - - /** - * Each FlutterFire plugin implementing FlutterFirebasePlugin provides this method allowing it's - * constants to be initialized during FirebaseCore.initializeApp in Dart. Here we call this method - * on each of the registered plugins and gather their constants for use in Dart. - * - * @param firebaseApp The Firebase App that the plugin should return constants for. - * @return A task returning the discovered constants for each plugin (using channelName as the Map - * key) for the provided Firebase App. - */ - static Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { - TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); - - cachedThreadPool.execute( - () -> { - 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))); - } - - taskCompletionSource.setResult(pluginConstants); - } catch (Exception e) { - taskCompletionSource.setException(e); - } - }); - - return taskCompletionSource.getTask(); - } - - /** - * Each FlutterFire plugin implementing this method are notified that FirebaseCore#initializeCore - * was called again. - * - *

This is used by plugins to know if they need to cleanup previous resources between Hot - * Restarts as `initializeCore` can only be called once in Dart. - */ - static Task didReinitializeFirebaseCore() { - TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); - - cachedThreadPool.execute( - () -> { - 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 taskCompletionSource.getTask(); - } -} diff --git a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.java b/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.java deleted file mode 100644 index af1dec848522..000000000000 --- a/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.java +++ /dev/null @@ -1,906 +0,0 @@ -// Copyright 2023, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// Autogenerated from Pigeon (v25.3.2), do not edit directly. -// See also: https://pub.dev/packages/pigeon - -package io.flutter.plugins.firebase.core; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.CLASS; - -import android.util.Log; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import io.flutter.plugin.common.BasicMessageChannel; -import io.flutter.plugin.common.BinaryMessenger; -import io.flutter.plugin.common.MessageCodec; -import io.flutter.plugin.common.StandardMessageCodec; -import java.io.ByteArrayOutputStream; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** Generated class from Pigeon. */ -@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) -public class GeneratedAndroidFirebaseCore { - - /** Error class for passing custom error details to Flutter via a thrown PlatformException. */ - public static class FlutterError extends RuntimeException { - - /** The error code. */ - public final String code; - - /** The error details. Must be a datatype supported by the api codec. */ - public final Object details; - - public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { - super(message); - this.code = code; - this.details = details; - } - } - - @NonNull - protected static ArrayList wrapError(@NonNull Throwable exception) { - ArrayList errorList = new ArrayList<>(3); - if (exception instanceof FlutterError) { - FlutterError error = (FlutterError) exception; - errorList.add(error.code); - errorList.add(error.getMessage()); - errorList.add(error.details); - } else { - errorList.add(exception.toString()); - errorList.add(exception.getClass().getSimpleName()); - errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); - } - return errorList; - } - - @Target(METHOD) - @Retention(CLASS) - @interface CanIgnoreReturnValue {} - - /** Generated class from Pigeon that represents data sent in messages. */ - public static final class CoreFirebaseOptions { - private @NonNull String apiKey; - - public @NonNull String getApiKey() { - return apiKey; - } - - public void setApiKey(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"apiKey\" is null."); - } - this.apiKey = setterArg; - } - - private @NonNull String appId; - - public @NonNull String getAppId() { - return appId; - } - - public void setAppId(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"appId\" is null."); - } - this.appId = setterArg; - } - - private @NonNull String messagingSenderId; - - public @NonNull String getMessagingSenderId() { - return messagingSenderId; - } - - public void setMessagingSenderId(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"messagingSenderId\" is null."); - } - this.messagingSenderId = setterArg; - } - - private @NonNull String projectId; - - public @NonNull String getProjectId() { - return projectId; - } - - public void setProjectId(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"projectId\" is null."); - } - this.projectId = setterArg; - } - - private @Nullable String authDomain; - - public @Nullable String getAuthDomain() { - return authDomain; - } - - public void setAuthDomain(@Nullable String setterArg) { - this.authDomain = setterArg; - } - - private @Nullable String databaseURL; - - public @Nullable String getDatabaseURL() { - return databaseURL; - } - - public void setDatabaseURL(@Nullable String setterArg) { - this.databaseURL = setterArg; - } - - private @Nullable String storageBucket; - - public @Nullable String getStorageBucket() { - return storageBucket; - } - - public void setStorageBucket(@Nullable String setterArg) { - this.storageBucket = setterArg; - } - - private @Nullable String measurementId; - - public @Nullable String getMeasurementId() { - return measurementId; - } - - public void setMeasurementId(@Nullable String setterArg) { - this.measurementId = setterArg; - } - - private @Nullable String trackingId; - - public @Nullable String getTrackingId() { - return trackingId; - } - - public void setTrackingId(@Nullable String setterArg) { - this.trackingId = setterArg; - } - - private @Nullable String deepLinkURLScheme; - - public @Nullable String getDeepLinkURLScheme() { - return deepLinkURLScheme; - } - - public void setDeepLinkURLScheme(@Nullable String setterArg) { - this.deepLinkURLScheme = setterArg; - } - - private @Nullable String androidClientId; - - public @Nullable String getAndroidClientId() { - return androidClientId; - } - - public void setAndroidClientId(@Nullable String setterArg) { - this.androidClientId = setterArg; - } - - private @Nullable String iosClientId; - - public @Nullable String getIosClientId() { - return iosClientId; - } - - public void setIosClientId(@Nullable String setterArg) { - this.iosClientId = setterArg; - } - - private @Nullable String iosBundleId; - - public @Nullable String getIosBundleId() { - return iosBundleId; - } - - public void setIosBundleId(@Nullable String setterArg) { - this.iosBundleId = setterArg; - } - - private @Nullable String appGroupId; - - public @Nullable String getAppGroupId() { - return appGroupId; - } - - public void setAppGroupId(@Nullable String setterArg) { - this.appGroupId = setterArg; - } - - /** Constructor is non-public to enforce null safety; use Builder. */ - CoreFirebaseOptions() {} - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - CoreFirebaseOptions that = (CoreFirebaseOptions) o; - return apiKey.equals(that.apiKey) - && appId.equals(that.appId) - && messagingSenderId.equals(that.messagingSenderId) - && projectId.equals(that.projectId) - && Objects.equals(authDomain, that.authDomain) - && Objects.equals(databaseURL, that.databaseURL) - && Objects.equals(storageBucket, that.storageBucket) - && Objects.equals(measurementId, that.measurementId) - && Objects.equals(trackingId, that.trackingId) - && Objects.equals(deepLinkURLScheme, that.deepLinkURLScheme) - && Objects.equals(androidClientId, that.androidClientId) - && Objects.equals(iosClientId, that.iosClientId) - && Objects.equals(iosBundleId, that.iosBundleId) - && Objects.equals(appGroupId, that.appGroupId); - } - - @Override - public int hashCode() { - return Objects.hash( - apiKey, - appId, - messagingSenderId, - projectId, - authDomain, - databaseURL, - storageBucket, - measurementId, - trackingId, - deepLinkURLScheme, - androidClientId, - iosClientId, - iosBundleId, - appGroupId); - } - - public static final class Builder { - - private @Nullable String apiKey; - - @CanIgnoreReturnValue - public @NonNull Builder setApiKey(@NonNull String setterArg) { - this.apiKey = setterArg; - return this; - } - - private @Nullable String appId; - - @CanIgnoreReturnValue - public @NonNull Builder setAppId(@NonNull String setterArg) { - this.appId = setterArg; - return this; - } - - private @Nullable String messagingSenderId; - - @CanIgnoreReturnValue - public @NonNull Builder setMessagingSenderId(@NonNull String setterArg) { - this.messagingSenderId = setterArg; - return this; - } - - private @Nullable String projectId; - - @CanIgnoreReturnValue - public @NonNull Builder setProjectId(@NonNull String setterArg) { - this.projectId = setterArg; - return this; - } - - private @Nullable String authDomain; - - @CanIgnoreReturnValue - public @NonNull Builder setAuthDomain(@Nullable String setterArg) { - this.authDomain = setterArg; - return this; - } - - private @Nullable String databaseURL; - - @CanIgnoreReturnValue - public @NonNull Builder setDatabaseURL(@Nullable String setterArg) { - this.databaseURL = setterArg; - return this; - } - - private @Nullable String storageBucket; - - @CanIgnoreReturnValue - public @NonNull Builder setStorageBucket(@Nullable String setterArg) { - this.storageBucket = setterArg; - return this; - } - - private @Nullable String measurementId; - - @CanIgnoreReturnValue - public @NonNull Builder setMeasurementId(@Nullable String setterArg) { - this.measurementId = setterArg; - return this; - } - - private @Nullable String trackingId; - - @CanIgnoreReturnValue - public @NonNull Builder setTrackingId(@Nullable String setterArg) { - this.trackingId = setterArg; - return this; - } - - private @Nullable String deepLinkURLScheme; - - @CanIgnoreReturnValue - public @NonNull Builder setDeepLinkURLScheme(@Nullable String setterArg) { - this.deepLinkURLScheme = setterArg; - return this; - } - - private @Nullable String androidClientId; - - @CanIgnoreReturnValue - public @NonNull Builder setAndroidClientId(@Nullable String setterArg) { - this.androidClientId = setterArg; - return this; - } - - private @Nullable String iosClientId; - - @CanIgnoreReturnValue - public @NonNull Builder setIosClientId(@Nullable String setterArg) { - this.iosClientId = setterArg; - return this; - } - - private @Nullable String iosBundleId; - - @CanIgnoreReturnValue - public @NonNull Builder setIosBundleId(@Nullable String setterArg) { - this.iosBundleId = setterArg; - return this; - } - - private @Nullable String appGroupId; - - @CanIgnoreReturnValue - public @NonNull Builder setAppGroupId(@Nullable String setterArg) { - this.appGroupId = setterArg; - return this; - } - - public @NonNull CoreFirebaseOptions build() { - CoreFirebaseOptions pigeonReturn = new CoreFirebaseOptions(); - pigeonReturn.setApiKey(apiKey); - pigeonReturn.setAppId(appId); - pigeonReturn.setMessagingSenderId(messagingSenderId); - pigeonReturn.setProjectId(projectId); - pigeonReturn.setAuthDomain(authDomain); - pigeonReturn.setDatabaseURL(databaseURL); - pigeonReturn.setStorageBucket(storageBucket); - pigeonReturn.setMeasurementId(measurementId); - pigeonReturn.setTrackingId(trackingId); - pigeonReturn.setDeepLinkURLScheme(deepLinkURLScheme); - pigeonReturn.setAndroidClientId(androidClientId); - pigeonReturn.setIosClientId(iosClientId); - pigeonReturn.setIosBundleId(iosBundleId); - pigeonReturn.setAppGroupId(appGroupId); - return pigeonReturn; - } - } - - @NonNull - ArrayList toList() { - ArrayList toListResult = new ArrayList<>(14); - toListResult.add(apiKey); - toListResult.add(appId); - toListResult.add(messagingSenderId); - toListResult.add(projectId); - toListResult.add(authDomain); - toListResult.add(databaseURL); - toListResult.add(storageBucket); - toListResult.add(measurementId); - toListResult.add(trackingId); - toListResult.add(deepLinkURLScheme); - toListResult.add(androidClientId); - toListResult.add(iosClientId); - toListResult.add(iosBundleId); - toListResult.add(appGroupId); - return toListResult; - } - - static @NonNull CoreFirebaseOptions fromList(@NonNull ArrayList pigeonVar_list) { - CoreFirebaseOptions pigeonResult = new CoreFirebaseOptions(); - Object apiKey = pigeonVar_list.get(0); - pigeonResult.setApiKey((String) apiKey); - Object appId = pigeonVar_list.get(1); - pigeonResult.setAppId((String) appId); - Object messagingSenderId = pigeonVar_list.get(2); - pigeonResult.setMessagingSenderId((String) messagingSenderId); - Object projectId = pigeonVar_list.get(3); - pigeonResult.setProjectId((String) projectId); - Object authDomain = pigeonVar_list.get(4); - pigeonResult.setAuthDomain((String) authDomain); - Object databaseURL = pigeonVar_list.get(5); - pigeonResult.setDatabaseURL((String) databaseURL); - Object storageBucket = pigeonVar_list.get(6); - pigeonResult.setStorageBucket((String) storageBucket); - Object measurementId = pigeonVar_list.get(7); - pigeonResult.setMeasurementId((String) measurementId); - Object trackingId = pigeonVar_list.get(8); - pigeonResult.setTrackingId((String) trackingId); - Object deepLinkURLScheme = pigeonVar_list.get(9); - pigeonResult.setDeepLinkURLScheme((String) deepLinkURLScheme); - Object androidClientId = pigeonVar_list.get(10); - pigeonResult.setAndroidClientId((String) androidClientId); - Object iosClientId = pigeonVar_list.get(11); - pigeonResult.setIosClientId((String) iosClientId); - Object iosBundleId = pigeonVar_list.get(12); - pigeonResult.setIosBundleId((String) iosBundleId); - Object appGroupId = pigeonVar_list.get(13); - pigeonResult.setAppGroupId((String) appGroupId); - return pigeonResult; - } - } - - /** Generated class from Pigeon that represents data sent in messages. */ - public static final class CoreInitializeResponse { - private @NonNull String name; - - public @NonNull String getName() { - return name; - } - - public void setName(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"name\" is null."); - } - this.name = setterArg; - } - - private @NonNull CoreFirebaseOptions options; - - public @NonNull CoreFirebaseOptions getOptions() { - return options; - } - - public void setOptions(@NonNull CoreFirebaseOptions setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"options\" is null."); - } - this.options = setterArg; - } - - private @Nullable Boolean isAutomaticDataCollectionEnabled; - - public @Nullable Boolean getIsAutomaticDataCollectionEnabled() { - return isAutomaticDataCollectionEnabled; - } - - public void setIsAutomaticDataCollectionEnabled(@Nullable Boolean setterArg) { - this.isAutomaticDataCollectionEnabled = setterArg; - } - - private @NonNull Map pluginConstants; - - public @NonNull Map getPluginConstants() { - return pluginConstants; - } - - public void setPluginConstants(@NonNull Map setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"pluginConstants\" is null."); - } - this.pluginConstants = setterArg; - } - - /** Constructor is non-public to enforce null safety; use Builder. */ - CoreInitializeResponse() {} - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - CoreInitializeResponse that = (CoreInitializeResponse) o; - return name.equals(that.name) - && options.equals(that.options) - && Objects.equals(isAutomaticDataCollectionEnabled, that.isAutomaticDataCollectionEnabled) - && pluginConstants.equals(that.pluginConstants); - } - - @Override - public int hashCode() { - return Objects.hash(name, options, isAutomaticDataCollectionEnabled, pluginConstants); - } - - public static final class Builder { - - private @Nullable String name; - - @CanIgnoreReturnValue - public @NonNull Builder setName(@NonNull String setterArg) { - this.name = setterArg; - return this; - } - - private @Nullable CoreFirebaseOptions options; - - @CanIgnoreReturnValue - public @NonNull Builder setOptions(@NonNull CoreFirebaseOptions setterArg) { - this.options = setterArg; - return this; - } - - private @Nullable Boolean isAutomaticDataCollectionEnabled; - - @CanIgnoreReturnValue - public @NonNull Builder setIsAutomaticDataCollectionEnabled(@Nullable Boolean setterArg) { - this.isAutomaticDataCollectionEnabled = setterArg; - return this; - } - - private @Nullable Map pluginConstants; - - @CanIgnoreReturnValue - public @NonNull Builder setPluginConstants(@NonNull Map setterArg) { - this.pluginConstants = setterArg; - return this; - } - - public @NonNull CoreInitializeResponse build() { - CoreInitializeResponse pigeonReturn = new CoreInitializeResponse(); - pigeonReturn.setName(name); - pigeonReturn.setOptions(options); - pigeonReturn.setIsAutomaticDataCollectionEnabled(isAutomaticDataCollectionEnabled); - pigeonReturn.setPluginConstants(pluginConstants); - return pigeonReturn; - } - } - - @NonNull - ArrayList toList() { - ArrayList toListResult = new ArrayList<>(4); - toListResult.add(name); - toListResult.add(options); - toListResult.add(isAutomaticDataCollectionEnabled); - toListResult.add(pluginConstants); - return toListResult; - } - - static @NonNull CoreInitializeResponse fromList(@NonNull ArrayList pigeonVar_list) { - CoreInitializeResponse pigeonResult = new CoreInitializeResponse(); - Object name = pigeonVar_list.get(0); - pigeonResult.setName((String) name); - Object options = pigeonVar_list.get(1); - pigeonResult.setOptions((CoreFirebaseOptions) options); - Object isAutomaticDataCollectionEnabled = pigeonVar_list.get(2); - pigeonResult.setIsAutomaticDataCollectionEnabled((Boolean) isAutomaticDataCollectionEnabled); - Object pluginConstants = pigeonVar_list.get(3); - pigeonResult.setPluginConstants((Map) pluginConstants); - return pigeonResult; - } - } - - private static class PigeonCodec extends StandardMessageCodec { - public static final PigeonCodec INSTANCE = new PigeonCodec(); - - private PigeonCodec() {} - - @Override - protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { - switch (type) { - case (byte) 129: - return CoreFirebaseOptions.fromList((ArrayList) readValue(buffer)); - case (byte) 130: - return CoreInitializeResponse.fromList((ArrayList) readValue(buffer)); - default: - return super.readValueOfType(type, buffer); - } - } - - @Override - protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { - if (value instanceof CoreFirebaseOptions) { - stream.write(129); - writeValue(stream, ((CoreFirebaseOptions) value).toList()); - } else if (value instanceof CoreInitializeResponse) { - stream.write(130); - writeValue(stream, ((CoreInitializeResponse) value).toList()); - } else { - super.writeValue(stream, value); - } - } - } - - /** Asynchronous error handling return type for non-nullable API method returns. */ - public interface Result { - /** Success case callback method for handling returns. */ - void success(@NonNull T result); - - /** Failure case callback method for handling errors. */ - void error(@NonNull Throwable error); - } - /** Asynchronous error handling return type for nullable API method returns. */ - public interface NullableResult { - /** Success case callback method for handling returns. */ - void success(@Nullable T result); - - /** Failure case callback method for handling errors. */ - void error(@NonNull Throwable error); - } - /** Asynchronous error handling return type for void API method returns. */ - public interface VoidResult { - /** Success case callback method for handling returns. */ - void success(); - - /** Failure case callback method for handling errors. */ - void error(@NonNull Throwable error); - } - /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ - public interface FirebaseCoreHostApi { - - void initializeApp( - @NonNull String appName, - @NonNull CoreFirebaseOptions initializeAppRequest, - @NonNull Result result); - - void initializeCore(@NonNull Result> result); - - void optionsFromResource(@NonNull Result result); - - /** The codec used by FirebaseCoreHostApi. */ - static @NonNull MessageCodec getCodec() { - return PigeonCodec.INSTANCE; - } - /** - * Sets up an instance of `FirebaseCoreHostApi` to handle messages through the - * `binaryMessenger`. - */ - static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable FirebaseCoreHostApi api) { - setUp(binaryMessenger, "", api); - } - - static void setUp( - @NonNull BinaryMessenger binaryMessenger, - @NonNull String messageChannelSuffix, - @Nullable FirebaseCoreHostApi api) { - messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp" - + messageChannelSuffix, - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); - ArrayList args = (ArrayList) message; - String appNameArg = (String) args.get(0); - CoreFirebaseOptions initializeAppRequestArg = (CoreFirebaseOptions) args.get(1); - Result resultCallback = - new Result() { - public void success(CoreInitializeResponse result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.initializeApp(appNameArg, initializeAppRequestArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore" - + messageChannelSuffix, - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); - Result> resultCallback = - new Result>() { - public void success(List result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.initializeCore(resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource" - + messageChannelSuffix, - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); - Result resultCallback = - new Result() { - public void success(CoreFirebaseOptions result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.optionsFromResource(resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - } - } - /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ - public interface FirebaseAppHostApi { - - void setAutomaticDataCollectionEnabled( - @NonNull String appName, @NonNull Boolean enabled, @NonNull VoidResult result); - - void setAutomaticResourceManagementEnabled( - @NonNull String appName, @NonNull Boolean enabled, @NonNull VoidResult result); - - void delete(@NonNull String appName, @NonNull VoidResult result); - - /** The codec used by FirebaseAppHostApi. */ - static @NonNull MessageCodec getCodec() { - return PigeonCodec.INSTANCE; - } - /** - * Sets up an instance of `FirebaseAppHostApi` to handle messages through the `binaryMessenger`. - */ - static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable FirebaseAppHostApi api) { - setUp(binaryMessenger, "", api); - } - - static void setUp( - @NonNull BinaryMessenger binaryMessenger, - @NonNull String messageChannelSuffix, - @Nullable FirebaseAppHostApi api) { - messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled" - + messageChannelSuffix, - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); - ArrayList args = (ArrayList) message; - String appNameArg = (String) args.get(0); - Boolean enabledArg = (Boolean) args.get(1); - VoidResult resultCallback = - new VoidResult() { - public void success() { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.setAutomaticDataCollectionEnabled(appNameArg, enabledArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled" - + messageChannelSuffix, - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); - ArrayList args = (ArrayList) message; - String appNameArg = (String) args.get(0); - Boolean enabledArg = (Boolean) args.get(1); - VoidResult resultCallback = - new VoidResult() { - public void success() { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.setAutomaticResourceManagementEnabled(appNameArg, enabledArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete" - + messageChannelSuffix, - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); - ArrayList args = (ArrayList) message; - String appNameArg = (String) args.get(0); - VoidResult resultCallback = - new VoidResult() { - public void success() { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.delete(appNameArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - } - } -} diff --git a/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.kt b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.kt new file mode 100644 index 000000000000..4cc3910d8236 --- /dev/null +++ b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.kt @@ -0,0 +1,198 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.firebase.core + +import android.content.Context +import android.os.Looper +import com.google.android.gms.tasks.Tasks +import com.google.firebase.FirebaseApp +import com.google.firebase.FirebaseOptions +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.plugins.firebase.core.FlutterFirebasePlugin.Companion.cachedThreadPool + +/** + * Flutter plugin implementation controlling the entrypoint for the Firebase SDK. + * + * Instantiate this in an add to app scenario to gracefully handle activity and context changes. + */ +class FlutterFirebaseCorePlugin : FlutterPlugin, + FirebaseCoreHostApi, + FirebaseAppHostApi { + + private var applicationContext: Context? = null + private var coreInitialized = false + + override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { + FirebaseCoreHostApi.setUp(binding.binaryMessenger, this) + FirebaseAppHostApi.setUp(binding.binaryMessenger, this) + applicationContext = binding.applicationContext + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + applicationContext = null + FirebaseCoreHostApi.setUp(binding.binaryMessenger, null) + FirebaseAppHostApi.setUp(binding.binaryMessenger, null) + } + + private fun firebaseOptionsToMap(options: FirebaseOptions): CoreFirebaseOptions { + return CoreFirebaseOptions( + apiKey = options.apiKey, + appId = options.applicationId, + messagingSenderId = options.gcmSenderId ?: "", + projectId = options.projectId ?: "", + authDomain = null, + databaseURL = options.databaseUrl, + storageBucket = options.storageBucket, + measurementId = null, + trackingId = options.gaTrackingId, + deepLinkURLScheme = null, + androidClientId = null, + iosClientId = null, + iosBundleId = null, + appGroupId = null + ) + } + + private fun firebaseAppToMap(firebaseApp: FirebaseApp): CoreInitializeResponse { + val pluginConstants: Map = try { + val constants = Tasks.await(FlutterFirebasePluginRegistry.getPluginConstantsForFirebaseApp(firebaseApp)) + constants.mapKeys { it.key as String? } + } catch (e: Exception) { + emptyMap() + } + + return CoreInitializeResponse( + name = firebaseApp.name, + options = firebaseOptionsToMap(firebaseApp.options), + isAutomaticDataCollectionEnabled = firebaseApp.isDataCollectionDefaultEnabled, + pluginConstants = pluginConstants + ) + } + + override fun initializeApp( + appName: String, + initializeAppRequest: CoreFirebaseOptions, + callback: (Result) -> Unit + ) { + cachedThreadPool.execute { + try { + val options = FirebaseOptions.Builder() + .setApiKey(initializeAppRequest.apiKey) + .setApplicationId(initializeAppRequest.appId) + .setDatabaseUrl(initializeAppRequest.databaseURL) + .setGcmSenderId(initializeAppRequest.messagingSenderId) + .setProjectId(initializeAppRequest.projectId) + .setStorageBucket(initializeAppRequest.storageBucket) + .setGaTrackingId(initializeAppRequest.trackingId) + .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 (e: Exception) { + // do nothing + } + + initializeAppRequest.authDomain?.let { + customAuthDomain[appName] = it + } + + val context = applicationContext ?: throw IllegalStateException("Application context is null") + val firebaseApp = FirebaseApp.initializeApp(context, options, appName) + val response = firebaseAppToMap(firebaseApp) + callback(Result.success(response)) + } catch (e: Exception) { + callback(Result.failure(e)) + } + } + } + + override fun initializeCore(callback: (Result>) -> Unit) { + cachedThreadPool.execute { + try { + if (!coreInitialized) { + coreInitialized = true + } else { + Tasks.await(FlutterFirebasePluginRegistry.didReinitializeFirebaseCore()) + } + + val context = applicationContext ?: throw IllegalStateException("Application context is null") + val firebaseApps = FirebaseApp.getApps(context) + val firebaseAppsList = firebaseApps.map { firebaseApp -> + firebaseAppToMap(firebaseApp) + } + + callback(Result.success(firebaseAppsList)) + } catch (e: Exception) { + callback(Result.failure(e)) + } + } + } + + override fun optionsFromResource(callback: (Result) -> Unit) { + cachedThreadPool.execute { + try { + val context = applicationContext ?: throw IllegalStateException("Application context is null") + val options = FirebaseOptions.fromResource(context) + if (options == null) { + callback(Result.failure( + Exception("Failed to load FirebaseOptions from resource. Check that you have defined values.xml correctly.") + )) + return@execute + } + callback(Result.success(firebaseOptionsToMap(options))) + } catch (e: Exception) { + callback(Result.failure(e)) + } + } + } + + override fun setAutomaticDataCollectionEnabled( + appName: String, + enabled: Boolean, + callback: (Result) -> Unit + ) { + cachedThreadPool.execute { + try { + val firebaseApp = FirebaseApp.getInstance(appName) + firebaseApp.setDataCollectionDefaultEnabled(enabled) + callback(Result.success(Unit)) + } catch (e: Exception) { + callback(Result.failure(e)) + } + } + } + + override fun setAutomaticResourceManagementEnabled( + appName: String, + enabled: Boolean, + callback: (Result) -> Unit + ) { + // Unsupported on Android - just succeed + callback(Result.success(Unit)) + } + + override fun delete(appName: String, callback: (Result) -> Unit) { + cachedThreadPool.execute { + try { + val firebaseApp = FirebaseApp.getInstance(appName) + try { + firebaseApp.delete() + } catch (appNotFoundException: IllegalStateException) { + // Ignore app not found exceptions. + } + callback(Result.success(Unit)) + } catch (e: Exception) { + callback(Result.failure(e)) + } + } + } + + companion object { + @JvmField + val customAuthDomain: MutableMap = mutableMapOf() + } +} diff --git a/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebaseCoreRegistrar.kt b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebaseCoreRegistrar.kt new file mode 100644 index 000000000000..4f732c10b913 --- /dev/null +++ b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebaseCoreRegistrar.kt @@ -0,0 +1,20 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.firebase.core + +import androidx.annotation.Keep +import com.google.firebase.components.Component +import com.google.firebase.components.ComponentRegistrar +import com.google.firebase.platforminfo.LibraryVersionComponent + +@Keep +class FlutterFirebaseCoreRegistrar : ComponentRegistrar { + override fun getComponents(): List> { + return listOf( + LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION) + ) + } +} + diff --git a/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebasePlugin.kt b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebasePlugin.kt new file mode 100644 index 000000000000..054b673dfa9c --- /dev/null +++ b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebasePlugin.kt @@ -0,0 +1,38 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.firebase.core + +import androidx.annotation.Keep +import com.google.android.gms.tasks.Task +import com.google.firebase.FirebaseApp +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + +@Keep +interface FlutterFirebasePlugin { + /** + * FlutterFire plugins implementing FlutterFirebasePlugin must provide this method to provide it's + * constants that are initialized during FirebaseCore.initializeApp in Dart. + * + * @param firebaseApp The Firebase App that the plugin should return constants for. + * @return A task returning the discovered constants for the plugin for the provided Firebase App. + */ + fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp): Task> + + /** + * FlutterFire plugins implementing FlutterFirebasePlugin should provide this method to be + * notified when FirebaseCore#initializeCore was called again (first time is ignored). + * + * This can be used by plugins to know when they might need to cleanup previous resources + * between Hot Restarts as `initializeCore` can only be called once in Dart. + */ + fun didReinitializeFirebaseCore(): Task + + companion object { + // A shared ExecutorService used by all FlutterFire Plugins for their GMS Tasks. + @JvmField + val cachedThreadPool: ExecutorService = Executors.newCachedThreadPool() + } +} + diff --git a/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.kt b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.kt new file mode 100644 index 000000000000..11f05f25ea6f --- /dev/null +++ b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/FlutterFirebasePluginRegistry.kt @@ -0,0 +1,87 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.firebase.core + +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 io.flutter.plugins.firebase.core.FlutterFirebasePlugin.Companion.cachedThreadPool +import java.util.WeakHashMap + +@Keep +object FlutterFirebasePluginRegistry { + + private val registeredPlugins: MutableMap = WeakHashMap() + + /** + * Register a Flutter Firebase plugin with the Firebase plugin registry. + * + * @param channelName The MethodChannel name for the plugin to be registered, for example: + * `plugins.flutter.io/firebase_core` + * @param flutterFirebasePlugin A FlutterPlugin that implements FlutterFirebasePlugin. + */ + @JvmStatic + fun registerPlugin(channelName: String, flutterFirebasePlugin: FlutterFirebasePlugin) { + registeredPlugins[channelName] = flutterFirebasePlugin + } + + /** + * Each FlutterFire plugin implementing FlutterFirebasePlugin provides this method allowing it's + * constants to be initialized during FirebaseCore.initializeApp in Dart. Here we call this method + * on each of the registered plugins and gather their constants for use in Dart. + * + * @param firebaseApp The Firebase App that the plugin should return constants for. + * @return A task returning the discovered constants for each plugin (using channelName as the Map + * key) for the provided Firebase App. + */ + @JvmStatic + internal fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp): Task> { + val taskCompletionSource = TaskCompletionSource>() + + cachedThreadPool.execute { + try { + val pluginConstants = mutableMapOf() + + for ((channelName, plugin) in registeredPlugins) { + pluginConstants[channelName] = Tasks.await(plugin.getPluginConstantsForFirebaseApp(firebaseApp)) + } + + taskCompletionSource.setResult(pluginConstants) + } catch (e: Exception) { + taskCompletionSource.setException(e) + } + } + + return taskCompletionSource.task + } + + /** + * Each FlutterFire plugin implementing this method are notified that FirebaseCore#initializeCore + * was called again. + * + * This is used by plugins to know if they need to cleanup previous resources between Hot + * Restarts as `initializeCore` can only be called once in Dart. + */ + @JvmStatic + internal fun didReinitializeFirebaseCore(): Task { + val taskCompletionSource = TaskCompletionSource() + + cachedThreadPool.execute { + try { + for ((_, plugin) in registeredPlugins) { + Tasks.await(plugin.didReinitializeFirebaseCore()) + } + + taskCompletionSource.setResult(null) + } catch (e: Exception) { + taskCompletionSource.setException(e) + } + } + + return taskCompletionSource.task + } +} + diff --git a/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.kt b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.kt new file mode 100644 index 000000000000..e1db1270af05 --- /dev/null +++ b/packages/firebase_core/firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.kt @@ -0,0 +1,370 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v25.3.2), do not edit directly. +// See also: https://pub.dev/packages/pigeon +@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") + +package io.flutter.plugins.firebase.core + +import android.util.Log +import io.flutter.plugin.common.BasicMessageChannel +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.EventChannel +import io.flutter.plugin.common.MessageCodec +import io.flutter.plugin.common.StandardMethodCodec +import io.flutter.plugin.common.StandardMessageCodec +import java.io.ByteArrayOutputStream +import java.nio.ByteBuffer +private object GeneratedAndroidFirebaseCorePigeonUtils { + + fun wrapResult(result: Any?): List { + return listOf(result) + } + + fun wrapError(exception: Throwable): List { + return if (exception is GeneratedAndroidFirebaseCoreError) { + listOf( + exception.code, + exception.message, + exception.details + ) + } else { + listOf( + exception.javaClass.simpleName, + exception.toString(), + "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) + ) + } + } + fun deepEquals(a: Any?, b: Any?): Boolean { + if (a is ByteArray && b is ByteArray) { + return a.contentEquals(b) + } + if (a is IntArray && b is IntArray) { + return a.contentEquals(b) + } + if (a is LongArray && b is LongArray) { + return a.contentEquals(b) + } + if (a is DoubleArray && b is DoubleArray) { + return a.contentEquals(b) + } + if (a is Array<*> && b is Array<*>) { + return a.size == b.size && + a.indices.all{ deepEquals(a[it], b[it]) } + } + if (a is List<*> && b is List<*>) { + return a.size == b.size && + a.indices.all{ deepEquals(a[it], b[it]) } + } + if (a is Map<*, *> && b is Map<*, *>) { + return a.size == b.size && a.all { + (b as Map).containsKey(it.key) && + deepEquals(it.value, b[it.key]) + } + } + return a == b + } + +} + +/** + * Error class for passing custom error details to Flutter via a thrown PlatformException. + * @property code The error code. + * @property message The error message. + * @property details The error details. Must be a datatype supported by the api codec. + */ +class GeneratedAndroidFirebaseCoreError ( + val code: String, + override val message: String? = null, + val details: Any? = null +) : Throwable() + +/** Generated class from Pigeon that represents data sent in messages. */ +data class CoreFirebaseOptions ( + val apiKey: String, + val appId: String, + val messagingSenderId: String, + val projectId: String, + val authDomain: String? = null, + val databaseURL: String? = null, + val storageBucket: String? = null, + val measurementId: String? = null, + val trackingId: String? = null, + val deepLinkURLScheme: String? = null, + val androidClientId: String? = null, + val iosClientId: String? = null, + val iosBundleId: String? = null, + val appGroupId: String? = null +) + { + companion object { + fun fromList(pigeonVar_list: List): CoreFirebaseOptions { + val apiKey = pigeonVar_list[0] as String + val appId = pigeonVar_list[1] as String + val messagingSenderId = pigeonVar_list[2] as String + val projectId = pigeonVar_list[3] as String + val authDomain = pigeonVar_list[4] as String? + val databaseURL = pigeonVar_list[5] as String? + val storageBucket = pigeonVar_list[6] as String? + val measurementId = pigeonVar_list[7] as String? + val trackingId = pigeonVar_list[8] as String? + val deepLinkURLScheme = pigeonVar_list[9] as String? + val androidClientId = pigeonVar_list[10] as String? + val iosClientId = pigeonVar_list[11] as String? + val iosBundleId = pigeonVar_list[12] as String? + val appGroupId = pigeonVar_list[13] as String? + return CoreFirebaseOptions(apiKey, appId, messagingSenderId, projectId, authDomain, databaseURL, storageBucket, measurementId, trackingId, deepLinkURLScheme, androidClientId, iosClientId, iosBundleId, appGroupId) + } + } + fun toList(): List { + return listOf( + apiKey, + appId, + messagingSenderId, + projectId, + authDomain, + databaseURL, + storageBucket, + measurementId, + trackingId, + deepLinkURLScheme, + androidClientId, + iosClientId, + iosBundleId, + appGroupId, + ) + } + override fun equals(other: Any?): Boolean { + if (other !is CoreFirebaseOptions) { + return false + } + if (this === other) { + return true + } + return GeneratedAndroidFirebaseCorePigeonUtils.deepEquals(toList(), other.toList()) } + + override fun hashCode(): Int = toList().hashCode() +} + +/** Generated class from Pigeon that represents data sent in messages. */ +data class CoreInitializeResponse ( + val name: String, + val options: CoreFirebaseOptions, + val isAutomaticDataCollectionEnabled: Boolean? = null, + val pluginConstants: Map +) + { + companion object { + fun fromList(pigeonVar_list: List): CoreInitializeResponse { + val name = pigeonVar_list[0] as String + val options = pigeonVar_list[1] as CoreFirebaseOptions + val isAutomaticDataCollectionEnabled = pigeonVar_list[2] as Boolean? + val pluginConstants = pigeonVar_list[3] as Map + return CoreInitializeResponse(name, options, isAutomaticDataCollectionEnabled, pluginConstants) + } + } + fun toList(): List { + return listOf( + name, + options, + isAutomaticDataCollectionEnabled, + pluginConstants, + ) + } + override fun equals(other: Any?): Boolean { + if (other !is CoreInitializeResponse) { + return false + } + if (this === other) { + return true + } + return GeneratedAndroidFirebaseCorePigeonUtils.deepEquals(toList(), other.toList()) } + + override fun hashCode(): Int = toList().hashCode() +} +private open class GeneratedAndroidFirebaseCorePigeonCodec : StandardMessageCodec() { + override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { + return when (type) { + 129.toByte() -> { + return (readValue(buffer) as? List)?.let { + CoreFirebaseOptions.fromList(it) + } + } + 130.toByte() -> { + return (readValue(buffer) as? List)?.let { + CoreInitializeResponse.fromList(it) + } + } + else -> super.readValueOfType(type, buffer) + } + } + override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { + when (value) { + is CoreFirebaseOptions -> { + stream.write(129) + writeValue(stream, value.toList()) + } + is CoreInitializeResponse -> { + stream.write(130) + writeValue(stream, value.toList()) + } + else -> super.writeValue(stream, value) + } + } +} + + +/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ +interface FirebaseCoreHostApi { + fun initializeApp(appName: String, initializeAppRequest: CoreFirebaseOptions, callback: (Result) -> Unit) + fun initializeCore(callback: (Result>) -> Unit) + fun optionsFromResource(callback: (Result) -> Unit) + + companion object { + /** The codec used by FirebaseCoreHostApi. */ + val codec: MessageCodec by lazy { + GeneratedAndroidFirebaseCorePigeonCodec() + } + /** Sets up an instance of `FirebaseCoreHostApi` to handle messages through the `binaryMessenger`. */ + @JvmOverloads + fun setUp(binaryMessenger: BinaryMessenger, api: FirebaseCoreHostApi?, messageChannelSuffix: String = "") { + val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + val initializeAppRequestArg = args[1] as CoreFirebaseOptions + api.initializeApp(appNameArg, initializeAppRequestArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + api.initializeCore{ result: Result> -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + api.optionsFromResource{ result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + } + } +} +/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ +interface FirebaseAppHostApi { + fun setAutomaticDataCollectionEnabled(appName: String, enabled: Boolean, callback: (Result) -> Unit) + fun setAutomaticResourceManagementEnabled(appName: String, enabled: Boolean, callback: (Result) -> Unit) + fun delete(appName: String, callback: (Result) -> Unit) + + companion object { + /** The codec used by FirebaseAppHostApi. */ + val codec: MessageCodec by lazy { + GeneratedAndroidFirebaseCorePigeonCodec() + } + /** Sets up an instance of `FirebaseAppHostApi` to handle messages through the `binaryMessenger`. */ + @JvmOverloads + fun setUp(binaryMessenger: BinaryMessenger, api: FirebaseAppHostApi?, messageChannelSuffix: String = "") { + val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + val enabledArg = args[1] as Boolean + api.setAutomaticDataCollectionEnabled(appNameArg, enabledArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapError(error)) + } else { + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + val enabledArg = args[1] as Boolean + api.setAutomaticResourceManagementEnabled(appNameArg, enabledArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapError(error)) + } else { + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + api.delete(appNameArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapError(error)) + } else { + reply.reply(GeneratedAndroidFirebaseCorePigeonUtils.wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + } + } +} diff --git a/packages/firebase_core/firebase_core/example/android/app/build.gradle b/packages/firebase_core/firebase_core/example/android/app/build.gradle index d2ebd42da7b2..3d06527a23e2 100644 --- a/packages/firebase_core/firebase_core/example/android/app/build.gradle +++ b/packages/firebase_core/firebase_core/example/android/app/build.gradle @@ -45,7 +45,7 @@ android { applicationId = "io.flutter.plugins.firebasecoreexample" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdk = 23 + minSdkVersion = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutterVersionCode.toInteger() versionName = flutterVersionName diff --git a/packages/firebase_core/firebase_core/ios/firebase_core.podspec b/packages/firebase_core/firebase_core/ios/firebase_core.podspec index b29fb36140db..1b52ba32a950 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core.podspec +++ b/packages/firebase_core/firebase_core/ios/firebase_core.podspec @@ -24,10 +24,11 @@ Pod::Spec.new do |s| s.license = { :file => '../LICENSE' } s.authors = 'The Chromium Authors' s.source = { :path => '.' } - s.source_files = 'firebase_core/Sources/firebase_core/**/*.{h,m}' - s.public_header_files = 'firebase_core/Sources/firebase_core/include/**/*.h' + s.source_files = 'firebase_core/Sources/firebase_core/**/*.swift' + s.public_header_files = [] s.ios.deployment_target = '15.0' + s.swift_version = '5.0' # Flutter dependencies s.dependency 'Flutter' diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m deleted file mode 100644 index 23b3f7b9433b..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#if __has_include("include/firebase_core/FLTFirebaseCorePlugin.h") -#import "include/firebase_core/FLTFirebaseCorePlugin.h" -#else -#import "include/FLTFirebaseCorePlugin.h" -#endif - -#if __has_include("include/firebase_core/FLTFirebasePluginRegistry.h") -#import "include/firebase_core/FLTFirebasePluginRegistry.h" -#else -#import "include/FLTFirebasePluginRegistry.h" -#endif - -#if __has_include("include/firebase_core/messages.g.h") -#import "include/firebase_core/messages.g.h" -#else -#import "include/messages.g.h" -#endif - -@implementation FLTFirebaseCorePlugin { - BOOL _coreInitialized; -} - -#pragma mark - FlutterPlugin - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FLTFirebaseCorePlugin *sharedInstance = [self sharedInstance]; -#if TARGET_OS_OSX -#else - [registrar publish:sharedInstance]; -#endif - SetUpFirebaseCoreHostApi(registrar.messenger, sharedInstance); - SetUpFirebaseAppHostApi(registrar.messenger, sharedInstance); -} - -// Returns a singleton instance of the Firebase Core plugin. -+ (instancetype)sharedInstance { - static dispatch_once_t onceToken; - static FLTFirebaseCorePlugin *instance; - - dispatch_once(&onceToken, ^{ - instance = [[FLTFirebaseCorePlugin alloc] init]; - // Register with the Flutter Firebase plugin registry. - [[FLTFirebasePluginRegistry sharedInstance] registerFirebasePlugin:instance]; - - // Initialize default Firebase app, but only if the plist file options - // exist. - // - If it is missing then there is no default app discovered in Dart and - // Dart throws an error. - // - Without this the iOS/MacOS app would crash immediately on calling - // [FIRApp configure] without - // providing helpful context about the crash to the user. - // - // Default app exists check is for backwards compatibility of legacy - // FlutterFire plugins that call [FIRApp configure]; themselves internally. - FIROptions *options = [FIROptions defaultOptions]; - if (options != nil && [FIRApp allApps][@"__FIRAPP_DEFAULT"] == nil) { - [FIRApp configureWithOptions:options]; - } - }); - - return instance; -} - -static NSMutableDictionary *customAuthDomains; - -// Initialize static properties - -+ (void)initialize { - if (self == [FLTFirebaseCorePlugin self]) { - customAuthDomains = [[NSMutableDictionary alloc] init]; - } -} - -+ (NSString *)getCustomDomain:(NSString *)appName { - return customAuthDomains[appName]; -} - -#pragma mark - Helpers - -- (CoreFirebaseOptions *)optionsFromFIROptions:(FIROptions *)options { - CoreFirebaseOptions *pigeonOptions = [CoreFirebaseOptions alloc]; - pigeonOptions.apiKey = (id)options.APIKey ?: [NSNull null]; - pigeonOptions.appId = (id)options.googleAppID ?: [NSNull null]; - pigeonOptions.messagingSenderId = (id)options.GCMSenderID ?: [NSNull null]; - pigeonOptions.projectId = (id)options.projectID ?: [NSNull null]; - pigeonOptions.databaseURL = (id)options.databaseURL ?: [NSNull null]; - pigeonOptions.storageBucket = (id)options.storageBucket ?: [NSNull null]; - pigeonOptions.deepLinkURLScheme = [NSNull null]; - pigeonOptions.iosBundleId = (id)options.bundleID ?: [NSNull null]; - pigeonOptions.iosClientId = (id)options.clientID ?: [NSNull null]; - pigeonOptions.appGroupId = (id)options.appGroupID ?: [NSNull null]; - return pigeonOptions; -} - -- (CoreInitializeResponse *)initializeResponseFromFIRApp:(FIRApp *)firebaseApp { - NSString *appNameDart = [FLTFirebasePlugin firebaseAppNameFromIosName:firebaseApp.name]; - CoreInitializeResponse *response = [CoreInitializeResponse alloc]; - response.name = appNameDart; - response.options = [self optionsFromFIROptions:firebaseApp.options]; - response.isAutomaticDataCollectionEnabled = @(firebaseApp.isDataCollectionDefaultEnabled); - response.pluginConstants = - [[FLTFirebasePluginRegistry sharedInstance] pluginConstantsForFIRApp:firebaseApp]; - - return response; -} - -#pragma mark - FLTFirebasePlugin - -- (void)didReinitializeFirebaseCore:(void (^)(void))completion { - completion(); -} - -- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *)firebase_app { - return @{}; -} - -- (NSString *_Nonnull)firebaseLibraryName { - return @LIBRARY_NAME; -} - -- (NSString *_Nonnull)firebaseLibraryVersion { - return @LIBRARY_VERSION; -} - -- (NSString *_Nonnull)flutterChannelName { - // The pigeon channel depends on each function - return @"dev.flutter.pigeon.FirebaseCoreHostApi.initializeApp"; -} - -#pragma mark - API - -- (void)initializeAppAppName:(nonnull NSString *)appName - initializeAppRequest:(nonnull CoreFirebaseOptions *)initializeAppRequest - completion:(nonnull void (^)(CoreInitializeResponse *_Nullable, - FlutterError *_Nullable))completion { - NSString *appNameIos = [FLTFirebasePlugin firebaseAppNameFromDartName:appName]; - - if ([FLTFirebasePlugin firebaseAppNamed:appNameIos]) { - completion([self initializeResponseFromFIRApp:[FLTFirebasePlugin firebaseAppNamed:appNameIos]], - nil); - return; - } - - NSString *appId = initializeAppRequest.appId; - NSString *messagingSenderId = initializeAppRequest.messagingSenderId; - FIROptions *options = [[FIROptions alloc] initWithGoogleAppID:appId - GCMSenderID:messagingSenderId]; - - options.APIKey = initializeAppRequest.apiKey; - options.projectID = initializeAppRequest.projectId; - - // kFirebaseOptionsDatabaseUrl - if (![initializeAppRequest.databaseURL isEqual:[NSNull null]]) { - options.databaseURL = initializeAppRequest.databaseURL; - } - - // kFirebaseOptionsStorageBucket - if (![options.storageBucket isEqual:[NSNull null]]) { - options.storageBucket = initializeAppRequest.storageBucket; - } - - // kFirebaseOptionsIosBundleId - if (![initializeAppRequest.iosBundleId isEqual:[NSNull null]]) { - options.bundleID = initializeAppRequest.iosBundleId; - } - - // kFirebaseOptionsIosClientId - if (![initializeAppRequest.iosClientId isEqual:[NSNull null]]) { - options.clientID = initializeAppRequest.iosClientId; - } - - // kFirebaseOptionsAppGroupId - if (![initializeAppRequest.appGroupId isEqual:[NSNull null]]) { - options.appGroupID = initializeAppRequest.appGroupId; - } - - if (initializeAppRequest.authDomain != nil) { - customAuthDomains[appNameIos] = initializeAppRequest.authDomain; - } - - [FIRApp configureWithName:appNameIos options:options]; - - completion([self initializeResponseFromFIRApp:[FIRApp appNamed:appNameIos]], nil); -} - -- (void)initializeCoreWithCompletion:(nonnull void (^)(NSArray *_Nullable, - FlutterError *_Nullable))completion { - void (^initializeCoreBlock)(void) = ^void() { - NSDictionary *firebaseApps = [FIRApp allApps]; - NSMutableArray *firebaseAppsArray = [NSMutableArray arrayWithCapacity:firebaseApps.count]; - - for (NSString *appName in firebaseApps) { - FIRApp *firebaseApp = firebaseApps[appName]; - [firebaseAppsArray addObject:[self initializeResponseFromFIRApp:firebaseApp]]; - } - - completion(firebaseAppsArray, nil); - }; - - if (!_coreInitialized) { - _coreInitialized = YES; - initializeCoreBlock(); - } else { - [[FLTFirebasePluginRegistry sharedInstance] didReinitializeFirebaseCore:initializeCoreBlock]; - } -} - -- (void)optionsFromResourceWithCompletion:(nonnull void (^)(CoreFirebaseOptions *_Nullable, - FlutterError *_Nullable))completion { - // Unsupported on iOS/MacOS. - completion(nil, nil); -} - -- (void)deleteAppName:(nonnull NSString *)appName - completion:(nonnull void (^)(FlutterError *_Nullable))completion { - FIRApp *firebaseApp = [FLTFirebasePlugin firebaseAppNamed:appName]; - - if (firebaseApp) { - [firebaseApp deleteApp:^(BOOL success) { - if (success) { - completion(nil); - } else { - completion([FlutterError errorWithCode:@"delete-failed" - message:@"Failed to delete a Firebase app instance." - details:nil]); - } - }]; - } else { - completion(nil); - } -} - -- (void)setAutomaticDataCollectionEnabledAppName:(nonnull NSString *)appName - enabled:(BOOL)enabled - completion: - (nonnull void (^)(FlutterError *_Nullable))completion { - FIRApp *firebaseApp = [FLTFirebasePlugin firebaseAppNamed:appName]; - if (firebaseApp) { - [firebaseApp setDataCollectionDefaultEnabled:enabled]; - } - - completion(nil); -} - -- (void)setAutomaticResourceManagementEnabledAppName:(nonnull NSString *)appName - enabled:(BOOL)enabled - completion:(nonnull void (^)(FlutterError *_Nullable)) - completion { - // Unsupported on iOS/MacOS. - completion(nil); -} - -@end diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift new file mode 100644 index 000000000000..9ad5af2c2aec --- /dev/null +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift @@ -0,0 +1,232 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import FirebaseCore +import Foundation + +#if os(macOS) +import FlutterMacOS +#else +import Flutter +#endif + +@objc public class FLTFirebaseCorePlugin: FLTFirebasePlugin, FlutterPlugin, FirebaseCoreHostApi, FirebaseAppHostApi { + private var coreInitialized = false + private static var customAuthDomains: [String: String] = [:] + + // MARK: - FlutterPlugin + + @objc public static func register(with registrar: FlutterPluginRegistrar) { + let instance = sharedInstance() + #if !os(macOS) + registrar.publish(instance) + #endif + FirebaseCoreHostApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) + FirebaseAppHostApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) + } + + // Returns a singleton instance of the Firebase Core plugin. + @objc public static func sharedInstance() -> FLTFirebaseCorePlugin { + struct Singleton { + static let instance: FLTFirebaseCorePlugin = { + let instance = FLTFirebaseCorePlugin() + // Register with the Flutter Firebase plugin registry. + FLTFirebasePluginRegistry.shared.registerFirebasePlugin(instance) + + // Initialize default Firebase app, but only if the plist file options exist. + // - If it is missing then there is no default app discovered in Dart and + // Dart throws an error. + // - Without this the iOS/MacOS app would crash immediately on calling + // FirebaseApp.configure() without providing helpful context about the crash to the user. + // + // Default app exists check is for backwards compatibility of legacy + // FlutterFire plugins that call FirebaseApp.configure() themselves internally. + if let options = FirebaseOptions.defaultOptions(), + FirebaseApp.app(name: kFIRDefaultAppNameIOS) == nil { + FirebaseApp.configure(options: options) + } + + return instance + }() + } + return Singleton.instance + } + + @objc public static func getCustomDomain(_ appName: String) -> String? { + return customAuthDomains[appName] + } + + // MARK: - Helpers + + private func optionsFromFIROptions(_ options: FirebaseOptions) -> CoreFirebaseOptions { + let pigeonOptions = CoreFirebaseOptions() + pigeonOptions.apiKey = options.apiKey + pigeonOptions.appId = options.googleAppID + pigeonOptions.messagingSenderId = options.gcmSenderID + pigeonOptions.projectId = options.projectID + pigeonOptions.databaseURL = options.databaseURL + pigeonOptions.storageBucket = options.storageBucket + pigeonOptions.iosBundleId = options.bundleID + pigeonOptions.iosClientId = options.clientID + pigeonOptions.appGroupId = options.appGroupID + return pigeonOptions + } + + private func initializeResponse(from firebaseApp: FirebaseApp) -> CoreInitializeResponse { + let appNameDart = FLTFirebasePlugin.firebaseAppName(fromIosName: firebaseApp.name) + let response = CoreInitializeResponse() + response.name = appNameDart + response.options = optionsFromFIROptions(firebaseApp.options) + response.isAutomaticDataCollectionEnabled = firebaseApp.isDataCollectionDefaultEnabled as NSNumber + response.pluginConstants = FLTFirebasePluginRegistry.shared.pluginConstants(forFIRApp: firebaseApp) + return response + } + + // MARK: - FLTFirebasePlugin + + @objc public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { + completion() + } + + @objc public func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] { + return [:] + } + + @objc public var firebaseLibraryName: String { + return String(cString: LIBRARY_NAME, encoding: .utf8) ?? "" + } + + @objc public var firebaseLibraryVersion: String { + return String(cString: LIBRARY_VERSION, encoding: .utf8) ?? "" + } + + @objc public var flutterChannelName: String { + // The pigeon channel depends on each function + return "dev.flutter.pigeon.FirebaseCoreHostApi.initializeApp" + } + + // MARK: - API + + public func initializeApp( + appName: String, + initializeAppRequest: CoreFirebaseOptions, + completion: @escaping (Result) -> Void + ) { + let appNameIos = FLTFirebasePlugin.firebaseAppName(fromDartName: appName) + + if let existingApp = FLTFirebasePlugin.firebaseApp(named: appName) { + completion(.success(initializeResponse(from: existingApp))) + return + } + + guard let appId = initializeAppRequest.appId, + let messagingSenderId = initializeAppRequest.messagingSenderId else { + completion(.failure(NSError(domain: "FLTFirebaseCore", + code: -1, + userInfo: [NSLocalizedDescriptionKey: "Missing required options"]))) + return + } + + let options = FirebaseOptions(googleAppID: appId, gcmSenderID: messagingSenderId) + options.apiKey = initializeAppRequest.apiKey + options.projectID = initializeAppRequest.projectId + + if let databaseURL = initializeAppRequest.databaseURL { + options.databaseURL = databaseURL + } + + if let storageBucket = initializeAppRequest.storageBucket { + options.storageBucket = storageBucket + } + + if let iosBundleId = initializeAppRequest.iosBundleId { + options.bundleID = iosBundleId + } + + if let iosClientId = initializeAppRequest.iosClientId { + options.clientID = iosClientId + } + + if let appGroupId = initializeAppRequest.appGroupId { + options.appGroupID = appGroupId + } + + if let authDomain = initializeAppRequest.authDomain { + FLTFirebaseCorePlugin.customAuthDomains[appNameIos] = authDomain + } + + FirebaseApp.configure(name: appNameIos, options: options) + + if let firebaseApp = FirebaseApp.app(name: appNameIos) { + completion(.success(initializeResponse(from: firebaseApp))) + } else { + completion(.failure(NSError(domain: "FLTFirebaseCore", + code: -1, + userInfo: [NSLocalizedDescriptionKey: "Failed to configure Firebase app"]))) + } + } + + public func initializeCore(completion: @escaping (Result<[CoreInitializeResponse], Error>) -> Void) { + let initializeCoreBlock: () -> Void = { + let firebaseApps = FirebaseApp.allApps() ?? [:] + var firebaseAppsArray: [CoreInitializeResponse] = [] + + for (_, firebaseApp) in firebaseApps { + firebaseAppsArray.append(self.initializeResponse(from: firebaseApp)) + } + + completion(.success(firebaseAppsArray)) + } + + if !coreInitialized { + coreInitialized = true + initializeCoreBlock() + } else { + FLTFirebasePluginRegistry.shared.didReinitializeFirebaseCore(completion: initializeCoreBlock) + } + } + + public func optionsFromResource(completion: @escaping (Result) -> Void) { + // Unsupported on iOS/MacOS. + completion(.success(CoreFirebaseOptions())) + } + + public func delete(appName: String, completion: @escaping (Result) -> Void) { + guard let firebaseApp = FLTFirebasePlugin.firebaseApp(named: appName) else { + completion(.success(())) + return + } + + firebaseApp.delete { success in + if success { + completion(.success(())) + } else { + completion(.failure(NSError(domain: "FLTFirebaseCore", + code: -1, + userInfo: [NSLocalizedDescriptionKey: "Failed to delete a Firebase app instance."]))) + } + } + } + + public func setAutomaticDataCollectionEnabled( + appName: String, + enabled: Bool, + completion: @escaping (Result) -> Void + ) { + if let firebaseApp = FLTFirebasePlugin.firebaseApp(named: appName) { + firebaseApp.isDataCollectionDefaultEnabled = enabled + } + completion(.success(())) + } + + public func setAutomaticResourceManagementEnabled( + appName: String, + enabled: Bool, + completion: @escaping (Result) -> Void + ) { + // Unsupported on iOS/MacOS. + completion(.success(())) + } +} + diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m deleted file mode 100644 index 2b00388f7f1c..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#if __has_include("include/firebase_core/FLTFirebasePlugin.h") -#import "include/firebase_core/FLTFirebasePlugin.h" -#else -#import "include/FLTFirebasePlugin.h" -#endif - -// Firebase default app name. -NSString *_Nonnull const kFIRDefaultAppNameIOS = @"__FIRAPP_DEFAULT"; -NSString *_Nonnull const kFIRDefaultAppNameDart = @"[DEFAULT]"; - -@interface FLTFirebaseMethodCallResult () -@property(readwrite, nonatomic) FLTFirebaseMethodCallErrorBlock error; -@property(readwrite, nonatomic) FLTFirebaseMethodCallSuccessBlock success; -@end -@implementation FLTFirebaseMethodCallResult - -+ (instancetype)createWithSuccess:(FLTFirebaseMethodCallSuccessBlock)successBlock - andErrorBlock:(FLTFirebaseMethodCallErrorBlock)errorBlock { - FLTFirebaseMethodCallResult *methodCallResult = [[FLTFirebaseMethodCallResult alloc] init]; - methodCallResult.error = errorBlock; - methodCallResult.success = successBlock; - return methodCallResult; -} - -@end - -@implementation FLTFirebasePlugin -+ (FlutterError *_Nonnull)createFlutterErrorFromCode:(NSString *_Nonnull)code - message:(NSString *_Nonnull)message - optionalDetails:(NSDictionary *_Nullable)details - andOptionalNSError:(NSError *_Nullable)error { - NSMutableDictionary *detailsDict = [NSMutableDictionary dictionaryWithDictionary:details ?: @{}]; - if (error != nil) { - detailsDict[@"nativeErrorCode"] = [@(error.code) stringValue]; - detailsDict[@"nativeErrorMessage"] = error.localizedDescription; - } - return [FlutterError errorWithCode:code message:message details:detailsDict]; -} - -+ (NSString *)firebaseAppNameFromDartName:(NSString *_Nonnull)appName { - NSString *appNameIOS = appName; - if ([kFIRDefaultAppNameDart isEqualToString:appName]) { - appNameIOS = kFIRDefaultAppNameIOS; - } - return appNameIOS; -} - -+ (NSString *_Nonnull)firebaseAppNameFromIosName:(NSString *_Nonnull)appName { - NSString *appNameDart = appName; - if ([kFIRDefaultAppNameIOS isEqualToString:appName]) { - appNameDart = kFIRDefaultAppNameDart; - } - return appNameDart; -} - -+ (FIRApp *_Nullable)firebaseAppNamed:(NSString *_Nonnull)appName { - return [FIRApp allApps][[self firebaseAppNameFromDartName:appName]]; -} -@end diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift new file mode 100644 index 000000000000..fecf38f682b6 --- /dev/null +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift @@ -0,0 +1,125 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import FirebaseCore +import Foundation + +#if os(macOS) +import FlutterMacOS +#else +import Flutter +#endif + +// Firebase default app names +let kFIRDefaultAppNameIOS = "__FIRAPP_DEFAULT" +let kFIRDefaultAppNameDart = "[DEFAULT]" + +/// Block that is capable of sending a success response to a method call operation. +public typealias FLTFirebaseMethodCallSuccessBlock = (Any?) -> Void + +/// Block that is capable of sending an error response to a method call operation. +public typealias FLTFirebaseMethodCallErrorBlock = (String?, String?, [String: Any]?, Error?) -> Void + +/// A protocol that all FlutterFire plugins should implement. +@objc public protocol FLTFirebasePlugin { + /// FlutterFire plugins implementing FLTFirebasePlugin should provide this method + /// to be notified when FirebaseCore#initializeCore was called again (first time is ignored). + /// + /// This can be used by plugins to know when they might need to cleanup previous + /// resources between Hot Restarts as `initializeCore` can only be called once in Dart. + @objc func didReinitializeFirebaseCore(completion: @escaping () -> Void) + + /// FlutterFire plugins implementing FLTFirebasePlugin must provide this method + /// to provide it's constants that are initialized during FirebaseCore.initializeApp in Dart. + /// + /// - Parameter firebaseApp: The Firebase App that the plugin should return constants for. + /// - Returns: A dictionary of constants for the plugin. + @objc func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] + + /// The Firebase library name of the plugin, used by FirebaseApp.registerLibrary + /// to register this plugin with the Firebase backend. + @objc var firebaseLibraryName: String { get } + + /// The Firebase library version of the plugin, used by FirebaseApp.registerLibrary + /// to register this plugin with the Firebase backend. + @objc var firebaseLibraryVersion: String { get } + + /// FlutterFire plugins implementing FLTFirebasePlugin must provide this method + /// to provide its main method channel name, used by FirebaseCore.initializeApp + /// in Dart to identify constants specific to a plugin. + @objc var flutterChannelName: String { get } +} + +/// An interface representing a returned result from a Flutter Method Call. +@objc public class FLTFirebaseMethodCallResult: NSObject { + @objc public let success: FLTFirebaseMethodCallSuccessBlock + @objc public let error: FLTFirebaseMethodCallErrorBlock + + private init(success: @escaping FLTFirebaseMethodCallSuccessBlock, + error: @escaping FLTFirebaseMethodCallErrorBlock) { + self.success = success + self.error = error + super.init() + } + + @objc public static func create(success: @escaping FLTFirebaseMethodCallSuccessBlock, + andErrorBlock error: @escaping FLTFirebaseMethodCallErrorBlock) -> FLTFirebaseMethodCallResult { + return FLTFirebaseMethodCallResult(success: success, error: error) + } +} + +@objc open class FLTFirebasePlugin: NSObject { + /// Creates a standardized instance of FlutterError using the values returned + /// through FLTFirebaseMethodCallErrorBlock. + /// + /// - Parameters: + /// - code: Error Code. + /// - message: Error Message. + /// - details: Optional dictionary of additional key/values to return to Dart. + /// - error: Optional Error that this error relates to. + /// - Returns: FlutterError instance. + @objc public static func createFlutterError(code: String, + message: String, + optionalDetails details: [String: Any]?, + andOptionalError error: Error?) -> FlutterError { + var detailsDict = details ?? [:] + if let error = error as NSError? { + detailsDict["nativeErrorCode"] = String(error.code) + detailsDict["nativeErrorMessage"] = error.localizedDescription + } + return FlutterError(code: code, message: message, details: detailsDict) + } + + /// Converts the '[DEFAULT]' app name used in dart and other SDKs to the + /// '__FIRAPP_DEFAULT' iOS equivalent. + /// + /// If name is not '[DEFAULT]' then just returns the same name that was passed in. + /// + /// - Parameter appName: The name of the Firebase App. + /// - Returns: The iOS-compatible app name. + @objc public static func firebaseAppName(fromDartName appName: String) -> String { + return appName == kFIRDefaultAppNameDart ? kFIRDefaultAppNameIOS : appName + } + + /// Converts the '__FIRAPP_DEFAULT' app name used in iOS to '[DEFAULT]' - used in + /// Dart & other SDKs. + /// + /// If name is not '__FIRAPP_DEFAULT' then just returns the same name that was passed in. + /// + /// - Parameter appName: The name of the Firebase App. + /// - Returns: The Dart-compatible app name. + @objc public static func firebaseAppName(fromIosName appName: String) -> String { + return appName == kFIRDefaultAppNameIOS ? kFIRDefaultAppNameDart : appName + } + + /// Retrieves a FirebaseApp instance based on the app name provided from Dart code. + /// + /// - Parameter appName: The name of the Firebase App. + /// - Returns: FirebaseApp instance, or nil if it doesn't exist. + @objc public static func firebaseApp(named appName: String) -> FirebaseApp? { + let iosName = firebaseAppName(fromDartName: appName) + return FirebaseApp.app(name: iosName) + } +} + diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m deleted file mode 100644 index a6f2f5657aae..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#if __has_include("include/firebase_core/FLTFirebasePluginRegistry.h") -#import "include/firebase_core/FLTFirebasePluginRegistry.h" -#else -#import "include/FLTFirebasePluginRegistry.h" -#endif - -#if __has_include() -#import -#define REGISTER_LIB -#elif __has_include() -#import -#define REGISTER_LIB -#endif - -@implementation FLTFirebasePluginRegistry { - NSMutableDictionary> *registeredPlugins; -} - -- (instancetype)init { - self = [super init]; - if (self) { - registeredPlugins = [NSMutableDictionary dictionary]; - } - return self; -} - -+ (instancetype)sharedInstance { - static dispatch_once_t onceToken; - static FLTFirebasePluginRegistry *instance; - - dispatch_once(&onceToken, ^{ - instance = [[FLTFirebasePluginRegistry alloc] init]; - }); - - return instance; -} - -- (void)registerFirebasePlugin:(id)firebasePlugin { - // Register the library with the Firebase backend. -#ifdef REGISTER_LIB - [FIRApp registerLibrary:[firebasePlugin firebaseLibraryName] - withVersion:[firebasePlugin firebaseLibraryVersion]]; -#endif - // Store the plugin delegate for later usage. - registeredPlugins[[firebasePlugin flutterChannelName]] = firebasePlugin; -} - -- (NSDictionary *)pluginConstantsForFIRApp:(FIRApp *)firebaseApp { - NSString *pluginFlutterChannelName; - NSMutableDictionary *pluginConstants = [NSMutableDictionary dictionary]; - - for (pluginFlutterChannelName in registeredPlugins) { - pluginConstants[pluginFlutterChannelName] = - [registeredPlugins[pluginFlutterChannelName] pluginConstantsForFIRApp:firebaseApp]; - } - - return pluginConstants; -} - -- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { - __block int pluginsCompleted = 0; - NSUInteger pluginsCount = [self->registeredPlugins allKeys].count; - void (^allPluginsCompletion)(void) = ^void() { - pluginsCompleted++; - if (pluginsCompleted == pluginsCount) { - completion(); - } - }; - - for (NSString *pluginFlutterChannelName in registeredPlugins) { - [registeredPlugins[pluginFlutterChannelName] didReinitializeFirebaseCore:allPluginsCompletion]; - } -} - -@end diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift new file mode 100644 index 000000000000..8455d07150be --- /dev/null +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift @@ -0,0 +1,86 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import FirebaseCore +import Foundation + +#if canImport(FirebaseCoreInternal) +import FirebaseCoreInternal +#endif + +@objc public class FLTFirebasePluginRegistry: NSObject { + private var registeredPlugins: [String: FLTFirebasePlugin] = [:] + + private override init() { + super.init() + } + + /// Get the shared singleton instance of the plugin registry. + /// + /// - Returns: Shared FLTFirebasePluginRegistry instance. + @objc public static let shared = FLTFirebasePluginRegistry() + + /// For compatibility with Objective-C code + @objc public static func sharedInstance() -> FLTFirebasePluginRegistry { + return shared + } + + /// Register a FlutterFire plugin with the plugin registry. + /// + /// Plugins must conform to the FLTFirebasePlugin protocol. + /// + /// - Parameter firebasePlugin: The plugin conforming to FLTFirebasePlugin protocol. + @objc public func registerFirebasePlugin(_ firebasePlugin: FLTFirebasePlugin) { + // Register the library with the Firebase backend. + #if canImport(FirebaseCoreInternal) + FirebaseApp.registerLibrary(withName: firebasePlugin.firebaseLibraryName, + withVersion: firebasePlugin.firebaseLibraryVersion) + #endif + + // Store the plugin delegate for later usage. + registeredPlugins[firebasePlugin.flutterChannelName] = firebasePlugin + } + + /// Each FlutterFire plugin implementing FLTFirebasePlugin provides this method, + /// allowing its constants to be initialized during FirebaseCore.initializeApp in Dart. + /// Here we call this method on each of the registered plugins and gather their constants for use in Dart. + /// + /// Constants for specific plugins are stored using the Flutter plugins channel name as the key. + /// + /// - Parameter firebaseApp: Firebase App instance these constants relate to. + /// - Returns: Dictionary of plugins and their constants. + @objc public func pluginConstants(forFIRApp firebaseApp: FirebaseApp) -> [String: Any] { + var pluginConstants: [String: Any] = [:] + + for (channelName, plugin) in registeredPlugins { + pluginConstants[channelName] = plugin.pluginConstants(for: firebaseApp) + } + + return pluginConstants + } + + /// Each FlutterFire plugin implementing this method are notified that + /// FirebaseCore#initializeCore was called again. + /// + /// This is used by plugins to know if they need to cleanup previous + /// resources between Hot Restarts as `initializeCore` can only be called once in Dart. + /// + /// - Parameter completion: Completion handler called when all plugins have completed. + @objc public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { + var pluginsCompleted = 0 + let pluginsCount = registeredPlugins.count + + let allPluginsCompletion: () -> Void = { + pluginsCompleted += 1 + if pluginsCompleted == pluginsCount { + completion() + } + } + + for plugin in registeredPlugins.values { + plugin.didReinitializeFirebaseCore(completion: allPluginsCompletion) + } + } +} + diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/dummy.m b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/dummy.m deleted file mode 100644 index b26e56855988..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/dummy.m +++ /dev/null @@ -1,3 +0,0 @@ -// Copyright 2023, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/.gitkeep b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h deleted file mode 100644 index accb377c7b46..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -#import - -#if TARGET_OS_OSX -#import -#else -#import -#endif - -#import "FLTFirebasePlugin.h" -#if __has_include("include/messages.g.h") -#import "include/messages.g.h" -#else -#import "messages.g.h" -#endif - -@interface FLTFirebaseCorePlugin - : FLTFirebasePlugin - -+ (NSString *)getCustomDomain:(NSString *)appName; - -@end diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h deleted file mode 100644 index 63e4290b4516..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Note: Don't use umbrella header here - will cause a -// build -// failure on MacOS builds (Flutter MacOS uses Swift) when this file is -// included in other Flutter plugins like Firestore with an error of -// "Include of non-modular header inside framework module". -#import -#import -#import - -#if TARGET_OS_OSX -#import -#else -#import -#endif - -/** - * Block that is capable of sending a success response to a method call - * operation. Use this for returning success data to a Method call. - */ -typedef void (^FLTFirebaseMethodCallSuccessBlock)(id _Nullable result); - -/** - * Block that is capable of sending an error response to a method call - * operation. Use this for returning error information to a Method call. - */ -typedef void (^FLTFirebaseMethodCallErrorBlock)(NSString *_Nullable code, - NSString *_Nullable message, - NSDictionary *_Nullable details, - NSError *_Nullable error); - -/** - * A protocol that all FlutterFire plugins should implement. - */ -@protocol FLTFirebasePlugin -/** - * FlutterFire plugins implementing FLTFirebasePlugin should provide this method - * to be notified when FirebaseCore#initializeCore was called again (first time - * is ignored). - * - * This can be used by plugins to know when they might need to cleanup previous - * resources between Hot Restarts as `initializeCore` can only be called once in - * Dart. - */ -@required -- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion; - -/** - * FlutterFire plugins implementing FLTFirebasePlugin must provide this method - * to provide it's constants that are initialized during - * FirebaseCore.initializeApp in Dart. - * - * @param registrar A helper providing application context and methods for - * registering callbacks. - */ -@required -- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *_Nonnull)firebaseApp; - -/** - * The Firebase library name of the plugin, used by - * [FIRApp registerLibrary:firebaseLibraryName withVersion:] to - * register this plugin with the Firebase backend. - * - * Usually this is provided by the 'LIBRARY_NAME' preprocessor definition - * defined in the plugins .podspec file. - */ -@required -- (NSString *_Nonnull)firebaseLibraryName; - -/** - * The Firebase library version of the plugin, used by - * FIRApp registerLibrary:withVersion:firebaseLibraryVersion] to - * register this plugin with the Firebase backend. - * - * Usually this is provided by the 'LIBRARY_VERSION' preprocessor definition - * defined in the plugins .podspec file. - */ -@required -- (NSString *_Nonnull)firebaseLibraryVersion; - -/** - * FlutterFire plugins implementing FLTFirebasePlugin must provide this method - * to provide its main method channel name, used by FirebaseCore.initializeApp - * in Dart to identify constants specific to a plugin. - */ -@required -- (NSString *_Nonnull)flutterChannelName; -@end - -/** - * An interface represent a returned result from a Flutter Method Call. - */ -@interface FLTFirebaseMethodCallResult : NSObject -+ (instancetype _Nonnull)createWithSuccess:(FLTFirebaseMethodCallSuccessBlock _Nonnull)successBlock - andErrorBlock:(FLTFirebaseMethodCallErrorBlock _Nonnull)errorBlock; - -/** - * Submit a result indicating a successful method call. - * - * E.g.: `result.success(nil);` - */ -@property(readonly, nonatomic) FLTFirebaseMethodCallSuccessBlock _Nonnull success; - -/** - * Submit a result indicating a failed method call. - * - * E.g.: `result.error(@"code", @"message", nil);` - */ -@property(readonly, nonatomic) FLTFirebaseMethodCallErrorBlock _Nonnull error; - -@end - -@interface FLTFirebasePlugin : NSObject -/** - * Creates a standardized instance of FlutterError using the values returned - * through FLTFirebaseMethodCallErrorBlock. - * - * @param code Error Code. - * @param message Error Message. - * @param details Optional dictionary of additional key/values to return to - * Dart. - * @param error Optional NSError that this error relates to. - * - * @return FlutterError - */ -+ (FlutterError *_Nonnull)createFlutterErrorFromCode:(NSString *_Nonnull)code - message:(NSString *_Nonnull)message - optionalDetails:(NSDictionary *_Nullable)details - andOptionalNSError:(NSError *_Nullable)error; - -/** - * Converts the '[DEFAULT]' app name used in dart and other SDKs to the - * '__FIRAPP_DEFAULT' iOS equivalent. - * - * If name is not '[DEFAULT]' then just returns the same name that was passed - * in. - * - * @param appName The name of the Firebase App. - * - * @return NSString - */ -+ (NSString *_Nonnull)firebaseAppNameFromDartName:(NSString *_Nonnull)appName; - -/** - * Converts the '__FIRAPP_DEFAULT' app name used in iOS to '[DEFAULT]' - used in - * Dart & other SDKs. - * - * If name is not '__FIRAPP_DEFAULT' then just returns the same name that was - * passed in. - * - * @param appName The name of the Firebase App. - * - * @return NSString - */ -+ (NSString *_Nonnull)firebaseAppNameFromIosName:(NSString *_Nonnull)appName; - -/** - * Retrieves a FIRApp instance based on the app name provided from Dart code. - * - * @param appName The name of the Firebase App. - * - * @return FIRApp - returns nil if Firebase app does not exist. - */ -+ (FIRApp *_Nullable)firebaseAppNamed:(NSString *_Nonnull)appName; -@end diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h deleted file mode 100644 index 17b454fc53e8..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import "FLTFirebasePlugin.h" - -@interface FLTFirebasePluginRegistry : NSObject -/** - * Get the shared singleton instance of the plugin registry. - * - * @return FLTFirebasePluginRegistry - */ -+ (instancetype _Nonnull)sharedInstance; - -/** - * Register a FlutterFire plugin with the plugin registry. - * - * Plugins must conform to the FLTFirebasePlugin protocol. - * - * @param firebasePlugin id - */ -- (void)registerFirebasePlugin:(id _Nonnull)firebasePlugin; - -/** - * Each FlutterFire plugin implementing FLTFirebasePlugin provides this method, - * allowing it's constants to be initialized during FirebaseCore.initializeApp - * in Dart. Here we call this method on each of the registered plugins and - * gather their constants for use in Dart. - * - * Constants for specific plugins are stored using the Flutter plugins channel - * name as the key. - * - * @param firebaseApp FIRApp Firebase App instance these constants relate to. - * @return NSDictionary Dictionary of plugins and their constants. - */ -- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *_Nonnull)firebaseApp; - -/** - * Each FlutterFire plugin implementing this method are notified that - * FirebaseCore#initializeCore was called again. - * - * This is used by plugins to know if they need to cleanup previous - * resources between Hot Restarts as `initializeCore` can only be called once in - * Dart. - */ -- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion; -@end diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/dummy.h b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/dummy.h deleted file mode 100644 index b26e56855988..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/dummy.h +++ /dev/null @@ -1,3 +0,0 @@ -// Copyright 2023, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h deleted file mode 100644 index cc06241e7cb1..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2023, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// Autogenerated from Pigeon (v25.3.2), do not edit directly. -// See also: https://pub.dev/packages/pigeon - -#import - -@protocol FlutterBinaryMessenger; -@protocol FlutterMessageCodec; -@class FlutterError; -@class FlutterStandardTypedData; - -NS_ASSUME_NONNULL_BEGIN - -@class CoreFirebaseOptions; -@class CoreInitializeResponse; - -@interface CoreFirebaseOptions : NSObject -/// `init` unavailable to enforce nonnull fields, see the `make` class method. -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithApiKey:(NSString *)apiKey - appId:(NSString *)appId - messagingSenderId:(NSString *)messagingSenderId - projectId:(NSString *)projectId - authDomain:(nullable NSString *)authDomain - databaseURL:(nullable NSString *)databaseURL - storageBucket:(nullable NSString *)storageBucket - measurementId:(nullable NSString *)measurementId - trackingId:(nullable NSString *)trackingId - deepLinkURLScheme:(nullable NSString *)deepLinkURLScheme - androidClientId:(nullable NSString *)androidClientId - iosClientId:(nullable NSString *)iosClientId - iosBundleId:(nullable NSString *)iosBundleId - appGroupId:(nullable NSString *)appGroupId; -@property(nonatomic, copy) NSString *apiKey; -@property(nonatomic, copy) NSString *appId; -@property(nonatomic, copy) NSString *messagingSenderId; -@property(nonatomic, copy) NSString *projectId; -@property(nonatomic, copy, nullable) NSString *authDomain; -@property(nonatomic, copy, nullable) NSString *databaseURL; -@property(nonatomic, copy, nullable) NSString *storageBucket; -@property(nonatomic, copy, nullable) NSString *measurementId; -@property(nonatomic, copy, nullable) NSString *trackingId; -@property(nonatomic, copy, nullable) NSString *deepLinkURLScheme; -@property(nonatomic, copy, nullable) NSString *androidClientId; -@property(nonatomic, copy, nullable) NSString *iosClientId; -@property(nonatomic, copy, nullable) NSString *iosBundleId; -@property(nonatomic, copy, nullable) NSString *appGroupId; -@end - -@interface CoreInitializeResponse : NSObject -/// `init` unavailable to enforce nonnull fields, see the `make` class method. -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithName:(NSString *)name - options:(CoreFirebaseOptions *)options - isAutomaticDataCollectionEnabled:(nullable NSNumber *)isAutomaticDataCollectionEnabled - pluginConstants:(NSDictionary *)pluginConstants; -@property(nonatomic, copy) NSString *name; -@property(nonatomic, strong) CoreFirebaseOptions *options; -@property(nonatomic, strong, nullable) NSNumber *isAutomaticDataCollectionEnabled; -@property(nonatomic, copy) NSDictionary *pluginConstants; -@end - -/// The codec used by all APIs. -NSObject *nullGetMessagesCodec(void); - -@protocol FirebaseCoreHostApi -- (void)initializeAppAppName:(NSString *)appName - initializeAppRequest:(CoreFirebaseOptions *)initializeAppRequest - completion:(void (^)(CoreInitializeResponse *_Nullable, - FlutterError *_Nullable))completion; -- (void)initializeCoreWithCompletion:(void (^)(NSArray *_Nullable, - FlutterError *_Nullable))completion; -- (void)optionsFromResourceWithCompletion:(void (^)(CoreFirebaseOptions *_Nullable, - FlutterError *_Nullable))completion; -@end - -extern void SetUpFirebaseCoreHostApi(id binaryMessenger, - NSObject *_Nullable api); - -extern void SetUpFirebaseCoreHostApiWithSuffix(id binaryMessenger, - NSObject *_Nullable api, - NSString *messageChannelSuffix); - -@protocol FirebaseAppHostApi -- (void)setAutomaticDataCollectionEnabledAppName:(NSString *)appName - enabled:(BOOL)enabled - completion:(void (^)(FlutterError *_Nullable))completion; -- (void)setAutomaticResourceManagementEnabledAppName:(NSString *)appName - enabled:(BOOL)enabled - completion:(void (^)(FlutterError *_Nullable))completion; -- (void)deleteAppName:(NSString *)appName completion:(void (^)(FlutterError *_Nullable))completion; -@end - -extern void SetUpFirebaseAppHostApi(id binaryMessenger, - NSObject *_Nullable api); - -extern void SetUpFirebaseAppHostApiWithSuffix(id binaryMessenger, - NSObject *_Nullable api, - NSString *messageChannelSuffix); - -NS_ASSUME_NONNULL_END diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.m b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.m deleted file mode 100644 index ff9ac9933bc0..000000000000 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.m +++ /dev/null @@ -1,389 +0,0 @@ -// Copyright 2023, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// Autogenerated from Pigeon (v25.3.2), do not edit directly. -// See also: https://pub.dev/packages/pigeon - -#if __has_include("include/firebase_core/messages.g.h") -#import "include/firebase_core/messages.g.h" -#else -#import "include/messages.g.h" -#endif - -#if TARGET_OS_OSX -#import -#else -#import -#endif - -#if !__has_feature(objc_arc) -#error File requires ARC to be enabled. -#endif - -static NSArray *wrapResult(id result, FlutterError *error) { - if (error) { - return @[ - error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] - ]; - } - return @[ result ?: [NSNull null] ]; -} - -static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { - id result = array[key]; - return (result == [NSNull null]) ? nil : result; -} - -@interface CoreFirebaseOptions () -+ (CoreFirebaseOptions *)fromList:(NSArray *)list; -+ (nullable CoreFirebaseOptions *)nullableFromList:(NSArray *)list; -- (NSArray *)toList; -@end - -@interface CoreInitializeResponse () -+ (CoreInitializeResponse *)fromList:(NSArray *)list; -+ (nullable CoreInitializeResponse *)nullableFromList:(NSArray *)list; -- (NSArray *)toList; -@end - -@implementation CoreFirebaseOptions -+ (instancetype)makeWithApiKey:(NSString *)apiKey - appId:(NSString *)appId - messagingSenderId:(NSString *)messagingSenderId - projectId:(NSString *)projectId - authDomain:(nullable NSString *)authDomain - databaseURL:(nullable NSString *)databaseURL - storageBucket:(nullable NSString *)storageBucket - measurementId:(nullable NSString *)measurementId - trackingId:(nullable NSString *)trackingId - deepLinkURLScheme:(nullable NSString *)deepLinkURLScheme - androidClientId:(nullable NSString *)androidClientId - iosClientId:(nullable NSString *)iosClientId - iosBundleId:(nullable NSString *)iosBundleId - appGroupId:(nullable NSString *)appGroupId { - CoreFirebaseOptions *pigeonResult = [[CoreFirebaseOptions alloc] init]; - pigeonResult.apiKey = apiKey; - pigeonResult.appId = appId; - pigeonResult.messagingSenderId = messagingSenderId; - pigeonResult.projectId = projectId; - pigeonResult.authDomain = authDomain; - pigeonResult.databaseURL = databaseURL; - pigeonResult.storageBucket = storageBucket; - pigeonResult.measurementId = measurementId; - pigeonResult.trackingId = trackingId; - pigeonResult.deepLinkURLScheme = deepLinkURLScheme; - pigeonResult.androidClientId = androidClientId; - pigeonResult.iosClientId = iosClientId; - pigeonResult.iosBundleId = iosBundleId; - pigeonResult.appGroupId = appGroupId; - return pigeonResult; -} -+ (CoreFirebaseOptions *)fromList:(NSArray *)list { - CoreFirebaseOptions *pigeonResult = [[CoreFirebaseOptions alloc] init]; - pigeonResult.apiKey = GetNullableObjectAtIndex(list, 0); - pigeonResult.appId = GetNullableObjectAtIndex(list, 1); - pigeonResult.messagingSenderId = GetNullableObjectAtIndex(list, 2); - pigeonResult.projectId = GetNullableObjectAtIndex(list, 3); - pigeonResult.authDomain = GetNullableObjectAtIndex(list, 4); - pigeonResult.databaseURL = GetNullableObjectAtIndex(list, 5); - pigeonResult.storageBucket = GetNullableObjectAtIndex(list, 6); - pigeonResult.measurementId = GetNullableObjectAtIndex(list, 7); - pigeonResult.trackingId = GetNullableObjectAtIndex(list, 8); - pigeonResult.deepLinkURLScheme = GetNullableObjectAtIndex(list, 9); - pigeonResult.androidClientId = GetNullableObjectAtIndex(list, 10); - pigeonResult.iosClientId = GetNullableObjectAtIndex(list, 11); - pigeonResult.iosBundleId = GetNullableObjectAtIndex(list, 12); - pigeonResult.appGroupId = GetNullableObjectAtIndex(list, 13); - return pigeonResult; -} -+ (nullable CoreFirebaseOptions *)nullableFromList:(NSArray *)list { - return (list) ? [CoreFirebaseOptions fromList:list] : nil; -} -- (NSArray *)toList { - return @[ - self.apiKey ?: [NSNull null], - self.appId ?: [NSNull null], - self.messagingSenderId ?: [NSNull null], - self.projectId ?: [NSNull null], - self.authDomain ?: [NSNull null], - self.databaseURL ?: [NSNull null], - self.storageBucket ?: [NSNull null], - self.measurementId ?: [NSNull null], - self.trackingId ?: [NSNull null], - self.deepLinkURLScheme ?: [NSNull null], - self.androidClientId ?: [NSNull null], - self.iosClientId ?: [NSNull null], - self.iosBundleId ?: [NSNull null], - self.appGroupId ?: [NSNull null], - ]; -} -@end - -@implementation CoreInitializeResponse -+ (instancetype)makeWithName:(NSString *)name - options:(CoreFirebaseOptions *)options - isAutomaticDataCollectionEnabled:(nullable NSNumber *)isAutomaticDataCollectionEnabled - pluginConstants:(NSDictionary *)pluginConstants { - CoreInitializeResponse *pigeonResult = [[CoreInitializeResponse alloc] init]; - pigeonResult.name = name; - pigeonResult.options = options; - pigeonResult.isAutomaticDataCollectionEnabled = isAutomaticDataCollectionEnabled; - pigeonResult.pluginConstants = pluginConstants; - return pigeonResult; -} -+ (CoreInitializeResponse *)fromList:(NSArray *)list { - CoreInitializeResponse *pigeonResult = [[CoreInitializeResponse alloc] init]; - pigeonResult.name = GetNullableObjectAtIndex(list, 0); - pigeonResult.options = GetNullableObjectAtIndex(list, 1); - pigeonResult.isAutomaticDataCollectionEnabled = GetNullableObjectAtIndex(list, 2); - pigeonResult.pluginConstants = GetNullableObjectAtIndex(list, 3); - return pigeonResult; -} -+ (nullable CoreInitializeResponse *)nullableFromList:(NSArray *)list { - return (list) ? [CoreInitializeResponse fromList:list] : nil; -} -- (NSArray *)toList { - return @[ - self.name ?: [NSNull null], - self.options ?: [NSNull null], - self.isAutomaticDataCollectionEnabled ?: [NSNull null], - self.pluginConstants ?: [NSNull null], - ]; -} -@end - -@interface nullMessagesPigeonCodecReader : FlutterStandardReader -@end -@implementation nullMessagesPigeonCodecReader -- (nullable id)readValueOfType:(UInt8)type { - switch (type) { - case 129: - return [CoreFirebaseOptions fromList:[self readValue]]; - case 130: - return [CoreInitializeResponse fromList:[self readValue]]; - default: - return [super readValueOfType:type]; - } -} -@end - -@interface nullMessagesPigeonCodecWriter : FlutterStandardWriter -@end -@implementation nullMessagesPigeonCodecWriter -- (void)writeValue:(id)value { - if ([value isKindOfClass:[CoreFirebaseOptions class]]) { - [self writeByte:129]; - [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[CoreInitializeResponse class]]) { - [self writeByte:130]; - [self writeValue:[value toList]]; - } else { - [super writeValue:value]; - } -} -@end - -@interface nullMessagesPigeonCodecReaderWriter : FlutterStandardReaderWriter -@end -@implementation nullMessagesPigeonCodecReaderWriter -- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { - return [[nullMessagesPigeonCodecWriter alloc] initWithData:data]; -} -- (FlutterStandardReader *)readerWithData:(NSData *)data { - return [[nullMessagesPigeonCodecReader alloc] initWithData:data]; -} -@end - -NSObject *nullGetMessagesCodec(void) { - static FlutterStandardMessageCodec *sSharedObject = nil; - static dispatch_once_t sPred = 0; - dispatch_once(&sPred, ^{ - nullMessagesPigeonCodecReaderWriter *readerWriter = - [[nullMessagesPigeonCodecReaderWriter alloc] init]; - sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; - }); - return sSharedObject; -} -void SetUpFirebaseCoreHostApi(id binaryMessenger, - NSObject *api) { - SetUpFirebaseCoreHostApiWithSuffix(binaryMessenger, api, @""); -} - -void SetUpFirebaseCoreHostApiWithSuffix(id binaryMessenger, - NSObject *api, - NSString *messageChannelSuffix) { - messageChannelSuffix = messageChannelSuffix.length > 0 - ? [NSString stringWithFormat:@".%@", messageChannelSuffix] - : @""; - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.firebase_core_platform_" - @"interface.FirebaseCoreHostApi.initializeApp", - messageChannelSuffix] - binaryMessenger:binaryMessenger - codec:nullGetMessagesCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(initializeAppAppName: - initializeAppRequest:completion:)], - @"FirebaseCoreHostApi api (%@) doesn't respond to " - @"@selector(initializeAppAppName:initializeAppRequest:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - NSString *arg_appName = GetNullableObjectAtIndex(args, 0); - CoreFirebaseOptions *arg_initializeAppRequest = GetNullableObjectAtIndex(args, 1); - [api initializeAppAppName:arg_appName - initializeAppRequest:arg_initializeAppRequest - completion:^(CoreInitializeResponse *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.firebase_core_platform_" - @"interface.FirebaseCoreHostApi.initializeCore", - messageChannelSuffix] - binaryMessenger:binaryMessenger - codec:nullGetMessagesCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(initializeCoreWithCompletion:)], - @"FirebaseCoreHostApi api (%@) doesn't respond to " - @"@selector(initializeCoreWithCompletion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - [api initializeCoreWithCompletion:^(NSArray *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString - stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.firebase_core_platform_interface." - @"FirebaseCoreHostApi.optionsFromResource", - messageChannelSuffix] - binaryMessenger:binaryMessenger - codec:nullGetMessagesCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(optionsFromResourceWithCompletion:)], - @"FirebaseCoreHostApi api (%@) doesn't respond to " - @"@selector(optionsFromResourceWithCompletion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - [api optionsFromResourceWithCompletion:^(CoreFirebaseOptions *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } -} -void SetUpFirebaseAppHostApi(id binaryMessenger, - NSObject *api) { - SetUpFirebaseAppHostApiWithSuffix(binaryMessenger, api, @""); -} - -void SetUpFirebaseAppHostApiWithSuffix(id binaryMessenger, - NSObject *api, - NSString *messageChannelSuffix) { - messageChannelSuffix = messageChannelSuffix.length > 0 - ? [NSString stringWithFormat:@".%@", messageChannelSuffix] - : @""; - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName: - [NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.firebase_core_platform_interface." - @"FirebaseAppHostApi.setAutomaticDataCollectionEnabled", - messageChannelSuffix] - binaryMessenger:binaryMessenger - codec:nullGetMessagesCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector - (setAutomaticDataCollectionEnabledAppName:enabled:completion:)], - @"FirebaseAppHostApi api (%@) doesn't respond to " - @"@selector(setAutomaticDataCollectionEnabledAppName:enabled:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - NSString *arg_appName = GetNullableObjectAtIndex(args, 0); - BOOL arg_enabled = [GetNullableObjectAtIndex(args, 1) boolValue]; - [api setAutomaticDataCollectionEnabledAppName:arg_appName - enabled:arg_enabled - completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat: - @"%@%@", - @"dev.flutter.pigeon.firebase_core_platform_interface." - @"FirebaseAppHostApi.setAutomaticResourceManagementEnabled", - messageChannelSuffix] - binaryMessenger:binaryMessenger - codec:nullGetMessagesCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector - (setAutomaticResourceManagementEnabledAppName:enabled:completion:)], - @"FirebaseAppHostApi api (%@) doesn't respond to " - @"@selector(setAutomaticResourceManagementEnabledAppName:enabled:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - NSString *arg_appName = GetNullableObjectAtIndex(args, 0); - BOOL arg_enabled = [GetNullableObjectAtIndex(args, 1) boolValue]; - [api setAutomaticResourceManagementEnabledAppName:arg_appName - enabled:arg_enabled - completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:[NSString stringWithFormat:@"%@%@", - @"dev.flutter.pigeon.firebase_core_platform_" - @"interface.FirebaseAppHostApi.delete", - messageChannelSuffix] - binaryMessenger:binaryMessenger - codec:nullGetMessagesCodec()]; - if (api) { - NSCAssert( - [api respondsToSelector:@selector(deleteAppName:completion:)], - @"FirebaseAppHostApi api (%@) doesn't respond to @selector(deleteAppName:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - NSString *arg_appName = GetNullableObjectAtIndex(args, 0); - [api deleteAppName:arg_appName - completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } -} diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.swift new file mode 100644 index 000000000000..5865f87fd6bb --- /dev/null +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.swift @@ -0,0 +1,420 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v25.3.2), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +import Foundation + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#else + #error("Unsupported platform.") +#endif + +/// Error class for passing custom error details to Dart side. +final class PigeonError: Error { + let code: String + let message: String? + let details: Sendable? + + init(code: String, message: String?, details: Sendable?) { + self.code = code + self.message = message + self.details = details + } + + var localizedDescription: String { + return + "PigeonError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" + } +} + +private func wrapResult(_ result: Any?) -> [Any?] { + return [result] +} + +private func wrapError(_ error: Any) -> [Any?] { + if let pigeonError = error as? PigeonError { + return [ + pigeonError.code, + pigeonError.message, + pigeonError.details, + ] + } + if let flutterError = error as? FlutterError { + return [ + flutterError.code, + flutterError.message, + flutterError.details, + ] + } + return [ + "\(error)", + "\(type(of: error))", + "Stacktrace: \(Thread.callStackSymbols)", + ] +} + +private func isNullish(_ value: Any?) -> Bool { + return value is NSNull || value == nil +} + +private func nilOrValue(_ value: Any?) -> T? { + if value is NSNull { return nil } + return value as! T? +} + +func deepEqualsmessages(_ lhs: Any?, _ rhs: Any?) -> Bool { + let cleanLhs = nilOrValue(lhs) as Any? + let cleanRhs = nilOrValue(rhs) as Any? + switch (cleanLhs, cleanRhs) { + case (nil, nil): + return true + + case (nil, _), (_, nil): + return false + + case is (Void, Void): + return true + + case let (cleanLhsHashable, cleanRhsHashable) as (AnyHashable, AnyHashable): + return cleanLhsHashable == cleanRhsHashable + + case let (cleanLhsArray, cleanRhsArray) as ([Any?], [Any?]): + guard cleanLhsArray.count == cleanRhsArray.count else { return false } + for (index, element) in cleanLhsArray.enumerated() { + if !deepEqualsmessages(element, cleanRhsArray[index]) { + return false + } + } + return true + + case let (cleanLhsDictionary, cleanRhsDictionary) as ([AnyHashable: Any?], [AnyHashable: Any?]): + guard cleanLhsDictionary.count == cleanRhsDictionary.count else { return false } + for (key, cleanLhsValue) in cleanLhsDictionary { + guard cleanRhsDictionary.index(forKey: key) != nil else { return false } + if !deepEqualsmessages(cleanLhsValue, cleanRhsDictionary[key]!) { + return false + } + } + return true + + default: + // Any other type shouldn't be able to be used with pigeon. File an issue if you find this to be untrue. + return false + } +} + +func deepHashmessages(value: Any?, hasher: inout Hasher) { + if let valueList = value as? [AnyHashable] { + for item in valueList { deepHashmessages(value: item, hasher: &hasher) } + return + } + + if let valueDict = value as? [AnyHashable: AnyHashable] { + for key in valueDict.keys { + hasher.combine(key) + deepHashmessages(value: valueDict[key]!, hasher: &hasher) + } + return + } + + if let hashableValue = value as? AnyHashable { + hasher.combine(hashableValue.hashValue) + } + + return hasher.combine(String(describing: value)) +} + + + +/// Generated class from Pigeon that represents data sent in messages. +struct CoreFirebaseOptions: Hashable { + var apiKey: String + var appId: String + var messagingSenderId: String + var projectId: String + var authDomain: String? = nil + var databaseURL: String? = nil + var storageBucket: String? = nil + var measurementId: String? = nil + var trackingId: String? = nil + var deepLinkURLScheme: String? = nil + var androidClientId: String? = nil + var iosClientId: String? = nil + var iosBundleId: String? = nil + var appGroupId: String? = nil + + + // swift-format-ignore: AlwaysUseLowerCamelCase + static func fromList(_ pigeonVar_list: [Any?]) -> CoreFirebaseOptions? { + let apiKey = pigeonVar_list[0] as! String + let appId = pigeonVar_list[1] as! String + let messagingSenderId = pigeonVar_list[2] as! String + let projectId = pigeonVar_list[3] as! String + let authDomain: String? = nilOrValue(pigeonVar_list[4]) + let databaseURL: String? = nilOrValue(pigeonVar_list[5]) + let storageBucket: String? = nilOrValue(pigeonVar_list[6]) + let measurementId: String? = nilOrValue(pigeonVar_list[7]) + let trackingId: String? = nilOrValue(pigeonVar_list[8]) + let deepLinkURLScheme: String? = nilOrValue(pigeonVar_list[9]) + let androidClientId: String? = nilOrValue(pigeonVar_list[10]) + let iosClientId: String? = nilOrValue(pigeonVar_list[11]) + let iosBundleId: String? = nilOrValue(pigeonVar_list[12]) + let appGroupId: String? = nilOrValue(pigeonVar_list[13]) + + return CoreFirebaseOptions( + apiKey: apiKey, + appId: appId, + messagingSenderId: messagingSenderId, + projectId: projectId, + authDomain: authDomain, + databaseURL: databaseURL, + storageBucket: storageBucket, + measurementId: measurementId, + trackingId: trackingId, + deepLinkURLScheme: deepLinkURLScheme, + androidClientId: androidClientId, + iosClientId: iosClientId, + iosBundleId: iosBundleId, + appGroupId: appGroupId + ) + } + func toList() -> [Any?] { + return [ + apiKey, + appId, + messagingSenderId, + projectId, + authDomain, + databaseURL, + storageBucket, + measurementId, + trackingId, + deepLinkURLScheme, + androidClientId, + iosClientId, + iosBundleId, + appGroupId, + ] + } + static func == (lhs: CoreFirebaseOptions, rhs: CoreFirebaseOptions) -> Bool { + return deepEqualsmessages(lhs.toList(), rhs.toList()) } + func hash(into hasher: inout Hasher) { + deepHashmessages(value: toList(), hasher: &hasher) + } +} + +/// Generated class from Pigeon that represents data sent in messages. +struct CoreInitializeResponse: Hashable { + var name: String + var options: CoreFirebaseOptions + var isAutomaticDataCollectionEnabled: Bool? = nil + var pluginConstants: [String?: Any?] + + + // swift-format-ignore: AlwaysUseLowerCamelCase + static func fromList(_ pigeonVar_list: [Any?]) -> CoreInitializeResponse? { + let name = pigeonVar_list[0] as! String + let options = pigeonVar_list[1] as! CoreFirebaseOptions + let isAutomaticDataCollectionEnabled: Bool? = nilOrValue(pigeonVar_list[2]) + let pluginConstants = pigeonVar_list[3] as! [String?: Any?] + + return CoreInitializeResponse( + name: name, + options: options, + isAutomaticDataCollectionEnabled: isAutomaticDataCollectionEnabled, + pluginConstants: pluginConstants + ) + } + func toList() -> [Any?] { + return [ + name, + options, + isAutomaticDataCollectionEnabled, + pluginConstants, + ] + } + static func == (lhs: CoreInitializeResponse, rhs: CoreInitializeResponse) -> Bool { + return deepEqualsmessages(lhs.toList(), rhs.toList()) } + func hash(into hasher: inout Hasher) { + deepHashmessages(value: toList(), hasher: &hasher) + } +} + +private class MessagesPigeonCodecReader: FlutterStandardReader { + override func readValue(ofType type: UInt8) -> Any? { + switch type { + case 129: + return CoreFirebaseOptions.fromList(self.readValue() as! [Any?]) + case 130: + return CoreInitializeResponse.fromList(self.readValue() as! [Any?]) + default: + return super.readValue(ofType: type) + } + } +} + +private class MessagesPigeonCodecWriter: FlutterStandardWriter { + override func writeValue(_ value: Any) { + if let value = value as? CoreFirebaseOptions { + super.writeByte(129) + super.writeValue(value.toList()) + } else if let value = value as? CoreInitializeResponse { + super.writeByte(130) + super.writeValue(value.toList()) + } else { + super.writeValue(value) + } + } +} + +private class MessagesPigeonCodecReaderWriter: FlutterStandardReaderWriter { + override func reader(with data: Data) -> FlutterStandardReader { + return MessagesPigeonCodecReader(data: data) + } + + override func writer(with data: NSMutableData) -> FlutterStandardWriter { + return MessagesPigeonCodecWriter(data: data) + } +} + +class MessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { + static let shared = MessagesPigeonCodec(readerWriter: MessagesPigeonCodecReaderWriter()) +} + + +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol FirebaseCoreHostApi { + func initializeApp(appName: String, initializeAppRequest: CoreFirebaseOptions, completion: @escaping (Result) -> Void) + func initializeCore(completion: @escaping (Result<[CoreInitializeResponse], Error>) -> Void) + func optionsFromResource(completion: @escaping (Result) -> Void) +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +class FirebaseCoreHostApiSetup { + static var codec: FlutterStandardMessageCodec { MessagesPigeonCodec.shared } + /// Sets up an instance of `FirebaseCoreHostApi` to handle messages through the `binaryMessenger`. + static func setUp(binaryMessenger: FlutterBinaryMessenger, api: FirebaseCoreHostApi?, messageChannelSuffix: String = "") { + let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" + let initializeAppChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + initializeAppChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let initializeAppRequestArg = args[1] as! CoreFirebaseOptions + api.initializeApp(appName: appNameArg, initializeAppRequest: initializeAppRequestArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + initializeAppChannel.setMessageHandler(nil) + } + let initializeCoreChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + initializeCoreChannel.setMessageHandler { _, reply in + api.initializeCore { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + initializeCoreChannel.setMessageHandler(nil) + } + let optionsFromResourceChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + optionsFromResourceChannel.setMessageHandler { _, reply in + api.optionsFromResource { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + optionsFromResourceChannel.setMessageHandler(nil) + } + } +} +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol FirebaseAppHostApi { + func setAutomaticDataCollectionEnabled(appName: String, enabled: Bool, completion: @escaping (Result) -> Void) + func setAutomaticResourceManagementEnabled(appName: String, enabled: Bool, completion: @escaping (Result) -> Void) + func delete(appName: String, completion: @escaping (Result) -> Void) +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +class FirebaseAppHostApiSetup { + static var codec: FlutterStandardMessageCodec { MessagesPigeonCodec.shared } + /// Sets up an instance of `FirebaseAppHostApi` to handle messages through the `binaryMessenger`. + static func setUp(binaryMessenger: FlutterBinaryMessenger, api: FirebaseAppHostApi?, messageChannelSuffix: String = "") { + let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" + let setAutomaticDataCollectionEnabledChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + setAutomaticDataCollectionEnabledChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let enabledArg = args[1] as! Bool + api.setAutomaticDataCollectionEnabled(appName: appNameArg, enabled: enabledArg) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + setAutomaticDataCollectionEnabledChannel.setMessageHandler(nil) + } + let setAutomaticResourceManagementEnabledChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + setAutomaticResourceManagementEnabledChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let enabledArg = args[1] as! Bool + api.setAutomaticResourceManagementEnabled(appName: appNameArg, enabled: enabledArg) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + setAutomaticResourceManagementEnabledChannel.setMessageHandler(nil) + } + let deleteChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + deleteChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + api.delete(appName: appNameArg) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + deleteChannel.setMessageHandler(nil) + } + } +} diff --git a/packages/firebase_core/firebase_core/macos/firebase_core.podspec b/packages/firebase_core/firebase_core/macos/firebase_core.podspec index 030602b6683b..db7ccf1ccdcc 100644 --- a/packages/firebase_core/firebase_core/macos/firebase_core.podspec +++ b/packages/firebase_core/firebase_core/macos/firebase_core.podspec @@ -42,10 +42,11 @@ Pod::Spec.new do |s| s.license = { :file => '../LICENSE' } s.authors = 'The Chromium Authors' s.source = { :path => '.' } - s.source_files = 'firebase_core/Sources/firebase_core/**/*.{h,m}' - s.public_header_files = 'firebase_core/Sources/firebase_core/include/**/*.h' + s.source_files = 'firebase_core/Sources/firebase_core/**/*.swift' + s.public_header_files = [] s.platform = :osx, '10.15' + s.swift_version = '5.0' # Flutter dependencies s.dependency 'FlutterMacOS' diff --git a/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/messages.pigeon.dart b/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/messages.pigeon.dart index d07a1ca4b84a..0d0f49ec28c7 100644 --- a/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/messages.pigeon.dart +++ b/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/messages.pigeon.dart @@ -18,8 +18,7 @@ PlatformException _createConnectionError(String channelName) { ); } -List wrapResponse( - {Object? result, PlatformException? error, bool empty = false}) { +List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { if (empty) { return []; } @@ -28,22 +27,21 @@ List wrapResponse( } return [error.code, error.message, error.details]; } - bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && a.indexed - .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); + .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); } if (a is Map && b is Map) { - return a.length == b.length && - a.entries.every((MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key])); + return a.length == b.length && a.entries.every((MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key])); } return a == b; } + class CoreFirebaseOptions { CoreFirebaseOptions({ required this.apiKey, @@ -110,8 +108,7 @@ class CoreFirebaseOptions { } Object encode() { - return _toList(); - } + return _toList(); } static CoreFirebaseOptions decode(Object result) { result as List; @@ -147,7 +144,8 @@ class CoreFirebaseOptions { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => Object.hashAll(_toList()) +; } class CoreInitializeResponse { @@ -176,8 +174,7 @@ class CoreInitializeResponse { } Object encode() { - return _toList(); - } + return _toList(); } static CoreInitializeResponse decode(Object result) { result as List; @@ -185,8 +182,7 @@ class CoreInitializeResponse { name: result[0]! as String, options: result[1]! as CoreFirebaseOptions, isAutomaticDataCollectionEnabled: result[2] as bool?, - pluginConstants: - (result[3] as Map?)!.cast(), + pluginConstants: (result[3] as Map?)!.cast(), ); } @@ -204,9 +200,11 @@ class CoreInitializeResponse { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => Object.hashAll(_toList()) +; } + class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -214,10 +212,10 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is CoreFirebaseOptions) { + } else if (value is CoreFirebaseOptions) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is CoreInitializeResponse) { + } else if (value is CoreInitializeResponse) { buffer.putUint8(130); writeValue(buffer, value.encode()); } else { @@ -228,9 +226,9 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return CoreFirebaseOptions.decode(readValue(buffer)!); - case 130: + case 130: return CoreInitializeResponse.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -242,29 +240,23 @@ class FirebaseCoreHostApi { /// Constructor for [FirebaseCoreHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - FirebaseCoreHostApi( - {BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + FirebaseCoreHostApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = - messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); final String pigeonVar_messageChannelSuffix; - Future initializeApp( - String appName, CoreFirebaseOptions initializeAppRequest) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( + Future initializeApp(String appName, CoreFirebaseOptions initializeAppRequest) async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = - pigeonVar_channel.send([appName, initializeAppRequest]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([appName, initializeAppRequest]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -286,10 +278,8 @@ class FirebaseCoreHostApi { } Future> initializeCore() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( + final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, @@ -311,16 +301,13 @@ class FirebaseCoreHostApi { message: 'Host platform returned null value for non-null return value.', ); } else { - return (pigeonVar_replyList[0] as List?)! - .cast(); + return (pigeonVar_replyList[0] as List?)!.cast(); } } Future optionsFromResource() async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( + final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, @@ -351,29 +338,23 @@ class FirebaseAppHostApi { /// Constructor for [FirebaseAppHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - FirebaseAppHostApi( - {BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + FirebaseAppHostApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = - messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); final String pigeonVar_messageChannelSuffix; - Future setAutomaticDataCollectionEnabled( - String appName, bool enabled) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( + Future setAutomaticDataCollectionEnabled(String appName, bool enabled) async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = - pigeonVar_channel.send([appName, enabled]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([appName, enabled]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -389,18 +370,14 @@ class FirebaseAppHostApi { } } - Future setAutomaticResourceManagementEnabled( - String appName, bool enabled) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( + Future setAutomaticResourceManagementEnabled(String appName, bool enabled) async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = - pigeonVar_channel.send([appName, enabled]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([appName, enabled]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -417,16 +394,13 @@ class FirebaseAppHostApi { } Future delete(String appName) async { - final String pigeonVar_channelName = - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( + final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = - pigeonVar_channel.send([appName]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([appName]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { diff --git a/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/test_api.dart b/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/test_api.dart index fbf2394b4022..184aeef7fd61 100644 --- a/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/test_api.dart +++ b/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/test_api.dart @@ -13,6 +13,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'messages.pigeon.dart'; + class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -20,10 +21,10 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is CoreFirebaseOptions) { + } else if (value is CoreFirebaseOptions) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is CoreInitializeResponse) { + } else if (value is CoreInitializeResponse) { buffer.putUint8(130); writeValue(buffer, value.encode()); } else { @@ -34,9 +35,9 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return CoreFirebaseOptions.decode(readValue(buffer)!); - case 130: + case 130: return CoreInitializeResponse.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -45,110 +46,79 @@ class _PigeonCodec extends StandardMessageCodec { } abstract class TestFirebaseCoreHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); - Future initializeApp( - String appName, CoreFirebaseOptions initializeAppRequest); + Future initializeApp(String appName, CoreFirebaseOptions initializeAppRequest); Future> initializeCore(); Future optionsFromResource(); - static void setUp( - TestFirebaseCoreHostApi? api, { - BinaryMessenger? binaryMessenger, - String messageChannelSuffix = '', - }) { - messageChannelSuffix = - messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp(TestFirebaseCoreHostApi? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; { - final BasicMessageChannel< - Object?> pigeonVar_channel = BasicMessageChannel< - Object?>( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp$messageChannelSuffix', - pigeonChannelCodec, + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp$messageChannelSuffix', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp was null.'); + 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp was null.'); final List args = (message as List?)!; final String? arg_appName = (args[0] as String?); assert(arg_appName != null, 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp was null, expected non-null String.'); - final CoreFirebaseOptions? arg_initializeAppRequest = - (args[1] as CoreFirebaseOptions?); + final CoreFirebaseOptions? arg_initializeAppRequest = (args[1] as CoreFirebaseOptions?); assert(arg_initializeAppRequest != null, 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp was null, expected non-null CoreFirebaseOptions.'); try { - final CoreInitializeResponse output = await api.initializeApp( - arg_appName!, arg_initializeAppRequest!); + final CoreInitializeResponse output = await api.initializeApp(arg_appName!, arg_initializeAppRequest!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel< - Object?> pigeonVar_channel = BasicMessageChannel< - Object?>( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore$messageChannelSuffix', - pigeonChannelCodec, + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore$messageChannelSuffix', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { try { - final List output = - await api.initializeCore(); + final List output = await api.initializeCore(); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel< - Object?> pigeonVar_channel = BasicMessageChannel< - Object?>( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource$messageChannelSuffix', - pigeonChannelCodec, + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource$messageChannelSuffix', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { try { final CoreFirebaseOptions output = await api.optionsFromResource(); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } @@ -157,40 +127,27 @@ abstract class TestFirebaseCoreHostApi { } abstract class TestFirebaseAppHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => - TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); Future setAutomaticDataCollectionEnabled(String appName, bool enabled); - Future setAutomaticResourceManagementEnabled( - String appName, bool enabled); + Future setAutomaticResourceManagementEnabled(String appName, bool enabled); Future delete(String appName); - static void setUp( - TestFirebaseAppHostApi? api, { - BinaryMessenger? binaryMessenger, - String messageChannelSuffix = '', - }) { - messageChannelSuffix = - messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp(TestFirebaseAppHostApi? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; { - final BasicMessageChannel< - Object?> pigeonVar_channel = BasicMessageChannel< - Object?>( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled$messageChannelSuffix', - pigeonChannelCodec, + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled$messageChannelSuffix', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled was null.'); + 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled was null.'); final List args = (message as List?)!; final String? arg_appName = (args[0] as String?); assert(arg_appName != null, @@ -199,34 +156,26 @@ abstract class TestFirebaseAppHostApi { assert(arg_enabled != null, 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled was null, expected non-null bool.'); try { - await api.setAutomaticDataCollectionEnabled( - arg_appName!, arg_enabled!); + await api.setAutomaticDataCollectionEnabled(arg_appName!, arg_enabled!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel< - Object?> pigeonVar_channel = BasicMessageChannel< - Object?>( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled$messageChannelSuffix', - pigeonChannelCodec, + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled$messageChannelSuffix', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled was null.'); + 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled was null.'); final List args = (message as List?)!; final String? arg_appName = (args[0] as String?); assert(arg_appName != null, @@ -235,34 +184,26 @@ abstract class TestFirebaseAppHostApi { assert(arg_enabled != null, 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled was null, expected non-null bool.'); try { - await api.setAutomaticResourceManagementEnabled( - arg_appName!, arg_enabled!); + await api.setAutomaticResourceManagementEnabled(arg_appName!, arg_enabled!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel< - Object?> pigeonVar_channel = BasicMessageChannel< - Object?>( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete$messageChannelSuffix', - pigeonChannelCodec, + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete$messageChannelSuffix', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger - .setMockDecodedMessageHandler(pigeonVar_channel, - (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete was null.'); + 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete was null.'); final List args = (message as List?)!; final String? arg_appName = (args[0] as String?); assert(arg_appName != null, @@ -272,9 +213,8 @@ abstract class TestFirebaseAppHostApi { return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } diff --git a/packages/firebase_core/firebase_core_platform_interface/pigeons/messages.dart b/packages/firebase_core/firebase_core_platform_interface/pigeons/messages.dart index 977270c87dc1..a615e87a9473 100644 --- a/packages/firebase_core/firebase_core_platform_interface/pigeons/messages.dart +++ b/packages/firebase_core/firebase_core_platform_interface/pigeons/messages.dart @@ -9,16 +9,14 @@ import 'package:pigeon/pigeon.dart'; dartOut: 'lib/src/pigeon/messages.pigeon.dart', // We export in the lib folder to expose the class to other packages. dartTestOut: 'lib/src/pigeon/test_api.dart', - javaOut: - '../firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.java', - javaOptions: JavaOptions( + kotlinOut: + '../firebase_core/android/src/main/kotlin/io/flutter/plugins/firebase/core/GeneratedAndroidFirebaseCore.kt', + kotlinOptions: KotlinOptions( package: 'io.flutter.plugins.firebase.core', - className: 'GeneratedAndroidFirebaseCore', + errorClassName: 'GeneratedAndroidFirebaseCoreError', ), - objcHeaderOut: - '../firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h', - objcSourceOut: - '../firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.m', + swiftOut: + '../firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.swift', cppHeaderOut: '../firebase_core/windows/messages.g.h', cppSourceOut: '../firebase_core/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'firebase_core_windows'), From 65681eb4118cab2bd1cdda995da92428b65430f4 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Thu, 30 Oct 2025 14:36:30 +0000 Subject: [PATCH 02/17] fix: ios bugs --- .../firebase_core/FLTFirebaseCorePlugin.swift | 90 ++++++++++--------- .../firebase_core/FLTFirebasePlugin.swift | 2 +- 2 files changed, 47 insertions(+), 45 deletions(-) diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift index 9ad5af2c2aec..155b7d2dac5a 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift @@ -11,7 +11,7 @@ import FlutterMacOS import Flutter #endif -@objc public class FLTFirebaseCorePlugin: FLTFirebasePlugin, FlutterPlugin, FirebaseCoreHostApi, FirebaseAppHostApi { +@objc public class FLTFirebaseCorePlugin: FLTFirebasePluginHelper, FlutterPlugin, FLTFirebasePlugin, FirebaseCoreHostApi, FirebaseAppHostApi { private var coreInitialized = false private static var customAuthDomains: [String: String] = [:] @@ -29,7 +29,7 @@ import Flutter // Returns a singleton instance of the Firebase Core plugin. @objc public static func sharedInstance() -> FLTFirebaseCorePlugin { struct Singleton { - static let instance: FLTFirebaseCorePlugin = { + static let instance: FLTFirebaseCorePlugin = { let instance = FLTFirebaseCorePlugin() // Register with the Flutter Firebase plugin registry. FLTFirebasePluginRegistry.shared.registerFirebasePlugin(instance) @@ -60,27 +60,27 @@ import Flutter // MARK: - Helpers private func optionsFromFIROptions(_ options: FirebaseOptions) -> CoreFirebaseOptions { - let pigeonOptions = CoreFirebaseOptions() - pigeonOptions.apiKey = options.apiKey - pigeonOptions.appId = options.googleAppID - pigeonOptions.messagingSenderId = options.gcmSenderID - pigeonOptions.projectId = options.projectID - pigeonOptions.databaseURL = options.databaseURL - pigeonOptions.storageBucket = options.storageBucket - pigeonOptions.iosBundleId = options.bundleID - pigeonOptions.iosClientId = options.clientID - pigeonOptions.appGroupId = options.appGroupID - return pigeonOptions + return CoreFirebaseOptions( + apiKey: options.apiKey ?? "", + appId: options.googleAppID, + messagingSenderId: options.gcmSenderID, + projectId: options.projectID ?? "", + databaseURL: options.databaseURL, + storageBucket: options.storageBucket, + iosClientId: options.clientID, + iosBundleId: options.bundleID, + appGroupId: options.appGroupID + ) } private func initializeResponse(from firebaseApp: FirebaseApp) -> CoreInitializeResponse { - let appNameDart = FLTFirebasePlugin.firebaseAppName(fromIosName: firebaseApp.name) - let response = CoreInitializeResponse() - response.name = appNameDart - response.options = optionsFromFIROptions(firebaseApp.options) - response.isAutomaticDataCollectionEnabled = firebaseApp.isDataCollectionDefaultEnabled as NSNumber - response.pluginConstants = FLTFirebasePluginRegistry.shared.pluginConstants(forFIRApp: firebaseApp) - return response + let appNameDart = FLTFirebasePluginHelper.firebaseAppName(fromIosName: firebaseApp.name) + return CoreInitializeResponse( + name: appNameDart, + options: optionsFromFIROptions(firebaseApp.options), + isAutomaticDataCollectionEnabled: firebaseApp.isDataCollectionDefaultEnabled, + pluginConstants: FLTFirebasePluginRegistry.shared.pluginConstants(forFIRApp: firebaseApp) + ) } // MARK: - FLTFirebasePlugin @@ -94,11 +94,12 @@ import Flutter } @objc public var firebaseLibraryName: String { - return String(cString: LIBRARY_NAME, encoding: .utf8) ?? "" + return "flutter-fire-core" } @objc public var firebaseLibraryVersion: String { - return String(cString: LIBRARY_VERSION, encoding: .utf8) ?? "" + // TODO: Get version from Package.swift or build configuration + return "4.2.0" } @objc public var flutterChannelName: String { @@ -108,25 +109,20 @@ import Flutter // MARK: - API - public func initializeApp( + func initializeApp( appName: String, initializeAppRequest: CoreFirebaseOptions, completion: @escaping (Result) -> Void ) { - let appNameIos = FLTFirebasePlugin.firebaseAppName(fromDartName: appName) + let appNameIos = FLTFirebasePluginHelper.firebaseAppName(fromDartName: appName) - if let existingApp = FLTFirebasePlugin.firebaseApp(named: appName) { + if let existingApp = FLTFirebasePluginHelper.firebaseApp(named: appName) { completion(.success(initializeResponse(from: existingApp))) return } - guard let appId = initializeAppRequest.appId, - let messagingSenderId = initializeAppRequest.messagingSenderId else { - completion(.failure(NSError(domain: "FLTFirebaseCore", - code: -1, - userInfo: [NSLocalizedDescriptionKey: "Missing required options"]))) - return - } + let appId = initializeAppRequest.appId + let messagingSenderId = initializeAppRequest.messagingSenderId let options = FirebaseOptions(googleAppID: appId, gcmSenderID: messagingSenderId) options.apiKey = initializeAppRequest.apiKey @@ -167,13 +163,14 @@ import Flutter } } - public func initializeCore(completion: @escaping (Result<[CoreInitializeResponse], Error>) -> Void) { + func initializeCore(completion: @escaping (Result<[CoreInitializeResponse], Error>) -> Void) { let initializeCoreBlock: () -> Void = { - let firebaseApps = FirebaseApp.allApps() ?? [:] var firebaseAppsArray: [CoreInitializeResponse] = [] - for (_, firebaseApp) in firebaseApps { - firebaseAppsArray.append(self.initializeResponse(from: firebaseApp)) + if let firebaseApps = FirebaseApp.allApps { + for (_, firebaseApp) in firebaseApps { + firebaseAppsArray.append(self.initializeResponse(from: firebaseApp)) + } } completion(.success(firebaseAppsArray)) @@ -187,13 +184,18 @@ import Flutter } } - public func optionsFromResource(completion: @escaping (Result) -> Void) { - // Unsupported on iOS/MacOS. - completion(.success(CoreFirebaseOptions())) + func optionsFromResource(completion: @escaping (Result) -> Void) { + // Unsupported on iOS/MacOS - return empty options with minimal required fields + completion(.success(CoreFirebaseOptions( + apiKey: "", + appId: "", + messagingSenderId: "", + projectId: "" + ))) } - public func delete(appName: String, completion: @escaping (Result) -> Void) { - guard let firebaseApp = FLTFirebasePlugin.firebaseApp(named: appName) else { + func delete(appName: String, completion: @escaping (Result) -> Void) { + guard let firebaseApp = FLTFirebasePluginHelper.firebaseApp(named: appName) else { completion(.success(())) return } @@ -209,18 +211,18 @@ import Flutter } } - public func setAutomaticDataCollectionEnabled( + func setAutomaticDataCollectionEnabled( appName: String, enabled: Bool, completion: @escaping (Result) -> Void ) { - if let firebaseApp = FLTFirebasePlugin.firebaseApp(named: appName) { + if let firebaseApp = FLTFirebasePluginHelper.firebaseApp(named: appName) { firebaseApp.isDataCollectionDefaultEnabled = enabled } completion(.success(())) } - public func setAutomaticResourceManagementEnabled( + func setAutomaticResourceManagementEnabled( appName: String, enabled: Bool, completion: @escaping (Result) -> Void diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift index fecf38f682b6..5af6d99040a3 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift @@ -69,7 +69,7 @@ public typealias FLTFirebaseMethodCallErrorBlock = (String?, String?, [String: A } } -@objc open class FLTFirebasePlugin: NSObject { +@objc open class FLTFirebasePluginHelper: NSObject { /// Creates a standardized instance of FlutterError using the values returned /// through FLTFirebaseMethodCallErrorBlock. /// From 9fb653be2d60911de0ad0afbe8a1dd121b15504d Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Tue, 4 Nov 2025 14:08:37 +0000 Subject: [PATCH 03/17] fix(android): reference bugs --- .../FlutterFirebaseAnalyticsPlugin.kt | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/firebase_analytics/firebase_analytics/android/src/main/kotlin/io/flutter/plugins/firebase/analytics/FlutterFirebaseAnalyticsPlugin.kt b/packages/firebase_analytics/firebase_analytics/android/src/main/kotlin/io/flutter/plugins/firebase/analytics/FlutterFirebaseAnalyticsPlugin.kt index aca07f356d51..ec7ad181ff94 100644 --- a/packages/firebase_analytics/firebase_analytics/android/src/main/kotlin/io/flutter/plugins/firebase/analytics/FlutterFirebaseAnalyticsPlugin.kt +++ b/packages/firebase_analytics/firebase_analytics/android/src/main/kotlin/io/flutter/plugins/firebase/analytics/FlutterFirebaseAnalyticsPlugin.kt @@ -18,7 +18,6 @@ import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.BinaryMessenger import io.flutter.plugin.common.MethodChannel import io.flutter.plugins.firebase.core.FlutterFirebasePlugin -import io.flutter.plugins.firebase.core.FlutterFirebasePlugin.cachedThreadPool import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry import java.util.Objects @@ -39,10 +38,10 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, this.messenger = messenger } - override fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp?): Task> { - val taskCompletionSource = TaskCompletionSource>() + override fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp): Task> { + val taskCompletionSource = TaskCompletionSource>() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { taskCompletionSource.setResult(HashMap()) } catch (e: Exception) { @@ -53,10 +52,10 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, return taskCompletionSource.task } - override fun didReinitializeFirebaseCore(): Task { - val taskCompletionSource = TaskCompletionSource() + override fun didReinitializeFirebaseCore(): Task { + val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { taskCompletionSource.setResult(null) } catch (e: java.lang.Exception) { @@ -84,7 +83,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleGetSessionId(): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { taskCompletionSource.setResult( Tasks.await( @@ -102,7 +101,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleLogEvent(arguments: Map): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { val eventName = Objects.requireNonNull(arguments[Constants.EVENT_NAME]) as String @@ -125,7 +124,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleSetUserId(userId: String?): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { analytics.setUserId(userId) taskCompletionSource.setResult(null) @@ -140,7 +139,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleSetAnalyticsCollectionEnabled(enabled: Boolean): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { analytics.setAnalyticsCollectionEnabled(enabled) taskCompletionSource.setResult(null) @@ -155,7 +154,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleSetSessionTimeoutDuration(milliseconds: Long): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { analytics.setSessionTimeoutDuration(milliseconds) taskCompletionSource.setResult(null) @@ -170,7 +169,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleSetUserProperty(name: String, value: String?): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { analytics.setUserProperty(name, value) taskCompletionSource.setResult(null) @@ -185,7 +184,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleResetAnalyticsData(): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { analytics.resetAnalyticsData() taskCompletionSource.setResult(null) @@ -200,7 +199,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleSetConsent(arguments: Map): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { val adStorageGranted = arguments[Constants.AD_STORAGE_CONSENT_GRANTED] @@ -255,7 +254,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleSetDefaultEventParameters(parameters: Map?): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { analytics.setDefaultEventParameters( createBundleFromMap( @@ -274,7 +273,7 @@ class FlutterFirebaseAnalyticsPlugin : FlutterFirebasePlugin, private fun handleGetAppInstanceId(): Task { val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + FlutterFirebasePlugin.cachedThreadPool.execute { try { taskCompletionSource.setResult( Tasks.await( From 5fee1c8e0cc66792ae3eea7a978765465f7896ec Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Tue, 4 Nov 2025 14:13:57 +0000 Subject: [PATCH 04/17] fix(ios): registarplugin reference --- .../firebase_core/FLTFirebasePluginRegistry.swift | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift index 8455d07150be..3da6dad42e03 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift @@ -32,11 +32,15 @@ import FirebaseCoreInternal /// /// - Parameter firebasePlugin: The plugin conforming to FLTFirebasePlugin protocol. @objc public func registerFirebasePlugin(_ firebasePlugin: FLTFirebasePlugin) { - // Register the library with the Firebase backend. - #if canImport(FirebaseCoreInternal) - FirebaseApp.registerLibrary(withName: firebasePlugin.firebaseLibraryName, - withVersion: firebasePlugin.firebaseLibraryVersion) - #endif + // Register the library with the Firebase backend using runtime checking + // for compatibility across different Firebase SDK versions. + if FirebaseApp.responds(to: NSSelectorFromString("registerLibrary:withVersion:")) { + FirebaseApp.perform( + NSSelectorFromString("registerLibrary:withVersion:"), + with: firebasePlugin.firebaseLibraryName, + with: firebasePlugin.firebaseLibraryVersion + ) + } // Store the plugin delegate for later usage. registeredPlugins[firebasePlugin.flutterChannelName] = firebasePlugin From 35c8cd624a4d6cef6d2881f381d5dad03a6fd2ce Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Tue, 4 Nov 2025 14:30:04 +0000 Subject: [PATCH 05/17] fix: registerPlugin issues --- .../functions/FlutterFirebaseFunctionsPlugin.kt | 4 ++-- .../FirebaseFunctionsPlugin.swift | 11 ++++++----- .../example/android/app/build.gradle | 2 +- .../FirebaseAnalyticsPlugin.swift | 11 ++++++----- .../FirebaseInstallationsPlugin.swift | 13 +++++++++---- .../FirebaseModelDownloaderPlugin.swift | 12 ++++++++---- .../FlutterFirebasePerformancePlugin.kt | 4 ++-- .../FirebasePerformancePlugin.swift | 11 ++++++----- .../FirebaseRemoteConfigPlugin.kt | 4 ++-- .../FirebaseRemoteConfigPlugin.swift | 17 +++++++++-------- 10 files changed, 51 insertions(+), 38 deletions(-) diff --git a/packages/cloud_functions/cloud_functions/android/src/main/kotlin/io/flutter/plugins/firebase/functions/FlutterFirebaseFunctionsPlugin.kt b/packages/cloud_functions/cloud_functions/android/src/main/kotlin/io/flutter/plugins/firebase/functions/FlutterFirebaseFunctionsPlugin.kt index 3705e390c0b8..6f20d1e76835 100644 --- a/packages/cloud_functions/cloud_functions/android/src/main/kotlin/io/flutter/plugins/firebase/functions/FlutterFirebaseFunctionsPlugin.kt +++ b/packages/cloud_functions/cloud_functions/android/src/main/kotlin/io/flutter/plugins/firebase/functions/FlutterFirebaseFunctionsPlugin.kt @@ -159,8 +159,8 @@ class FlutterFirebaseFunctionsPlugin return taskCompletionSource.task } - override fun didReinitializeFirebaseCore(): Task { - val taskCompletionSource = TaskCompletionSource() + override fun didReinitializeFirebaseCore(): Task { + val taskCompletionSource = TaskCompletionSource() FlutterFirebasePlugin.cachedThreadPool.execute { taskCompletionSource.setResult(null) } diff --git a/packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FirebaseFunctionsPlugin.swift b/packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FirebaseFunctionsPlugin.swift index 7163bdda6f10..4e15f6efa58b 100644 --- a/packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FirebaseFunctionsPlugin.swift +++ b/packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FirebaseFunctionsPlugin.swift @@ -13,13 +13,14 @@ #else import firebase_core_shared #endif +import FirebaseCore import FirebaseFunctions extension FlutterError: Error {} let kFLTFirebaseFunctionsChannelName = "plugins.flutter.io/firebase_functions" -public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePluginProtocol, FlutterPlugin, +public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePlugin, FlutterPlugin, CloudFunctionsHostApi { func call(arguments: [String: Any?], completion: @escaping (Result) -> Void) { httpsFunctionCall(arguments: arguments) { result, error in @@ -48,7 +49,7 @@ public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePluginProtocol, Flutt self.binaryMessenger = binaryMessenger } - public func firebaseLibraryVersion() -> String { + public var firebaseLibraryVersion: String { versionNumber } @@ -56,15 +57,15 @@ public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePluginProtocol, Flutt completion() } - public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + public func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] { [:] } - @objc public func firebaseLibraryName() -> String { + public var firebaseLibraryName: String { "flutter-fire-fn" } - @objc public func flutterChannelName() -> String { + public var flutterChannelName: String { kFLTFirebaseFunctionsChannelName } diff --git a/packages/firebase_analytics/firebase_analytics/example/android/app/build.gradle b/packages/firebase_analytics/firebase_analytics/example/android/app/build.gradle index c05ed68b6947..c14bfd758a56 100644 --- a/packages/firebase_analytics/firebase_analytics/example/android/app/build.gradle +++ b/packages/firebase_analytics/firebase_analytics/example/android/app/build.gradle @@ -45,7 +45,7 @@ android { applicationId = "io.flutter.plugins.firebase.analytics.example" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdk = 23 + minSdkVersion = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutterVersionCode.toInteger() versionName = flutterVersionName diff --git a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift index fcd6bda21819..106908ff823d 100644 --- a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift +++ b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift @@ -13,6 +13,7 @@ #else import firebase_core_shared #endif +import FirebaseCore import FirebaseAnalytics let kFLTFirebaseAnalyticsName = "name" @@ -28,7 +29,7 @@ let kFLTFirebaseAnalyticsUserId = "userId" let FLTFirebaseAnalyticsChannelName = "plugins.flutter.io/firebase_analytics" -public class FirebaseAnalyticsPlugin: NSObject, FLTFirebasePluginProtocol, FlutterPlugin, +public class FirebaseAnalyticsPlugin: NSObject, FLTFirebasePlugin, FlutterPlugin, FirebaseAnalyticsHostApi { public static func register(with registrar: any FlutterPluginRegistrar) { let binaryMessenger: FlutterBinaryMessenger @@ -146,19 +147,19 @@ public class FirebaseAnalyticsPlugin: NSObject, FLTFirebasePluginProtocol, Flutt completion() } - public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + public func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] { [:] } - public func firebaseLibraryName() -> String { + public var firebaseLibraryName: String { "flutter-fire-analytics" } - public func firebaseLibraryVersion() -> String { + public var firebaseLibraryVersion: String { versionNumber } - public func flutterChannelName() -> String { + public var flutterChannelName: String { FLTFirebaseAnalyticsChannelName } } diff --git a/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift b/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift index fb9ed2a06894..32f2640c5520 100644 --- a/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift +++ b/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift @@ -13,11 +13,12 @@ #else import firebase_core_shared #endif +import FirebaseCore import FirebaseInstallations let kFLTFirebaseInstallationsChannelName = "plugins.flutter.io/firebase_app_installations" -public class FirebaseInstallationsPlugin: NSObject, FLTFirebasePluginProtocol, FlutterPlugin { +public class FirebaseInstallationsPlugin: NSObject, FLTFirebasePlugin, FlutterPlugin { private var eventSink: FlutterEventSink? private var messenger: FlutterBinaryMessenger private var streamHandler = [String: IdChangedStreamHandler?]() @@ -52,15 +53,19 @@ public class FirebaseInstallationsPlugin: NSObject, FLTFirebasePluginProtocol, F completion() } - public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + public func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] { [:] } - @objc public func firebaseLibraryName() -> String { + public var firebaseLibraryName: String { "flutter-fire-installations" } - @objc public func flutterChannelName() -> String { + public var firebaseLibraryVersion: String { + versionNumber + } + + public var flutterChannelName: String { kFLTFirebaseInstallationsChannelName } diff --git a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift index 3d512ac1457a..bc0c13a36df8 100644 --- a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift +++ b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift @@ -19,7 +19,7 @@ import FirebaseMLModelDownloader let kFLTFirebaseModelDownloaderChannelName = "plugins.flutter.io/firebase_ml_model_downloader" -public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePluginProtocol, FlutterPlugin { +public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePlugin, FlutterPlugin { public static func register(with registrar: FlutterPluginRegistrar) { let binaryMessenger: FlutterBinaryMessenger @@ -49,15 +49,19 @@ public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePluginProtocol, completion() } - public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + public func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] { [:] } - @objc public func firebaseLibraryName() -> String { + public var firebaseLibraryName: String { "flutter-fire-ml-downloader" } - @objc public func flutterChannelName() -> String { + public var firebaseLibraryVersion: String { + versionNumber + } + + public var flutterChannelName: String { "plugins.flutter.io/firebase_ml_model_downloader" } diff --git a/packages/firebase_performance/firebase_performance/android/src/main/kotlin/io/flutter/plugins/firebase/performance/FlutterFirebasePerformancePlugin.kt b/packages/firebase_performance/firebase_performance/android/src/main/kotlin/io/flutter/plugins/firebase/performance/FlutterFirebasePerformancePlugin.kt index dfc913d0700e..fc26a4d11dde 100644 --- a/packages/firebase_performance/firebase_performance/android/src/main/kotlin/io/flutter/plugins/firebase/performance/FlutterFirebasePerformancePlugin.kt +++ b/packages/firebase_performance/firebase_performance/android/src/main/kotlin/io/flutter/plugins/firebase/performance/FlutterFirebasePerformancePlugin.kt @@ -170,8 +170,8 @@ class FlutterFirebasePerformancePlugin return taskCompletionSource.task } - override fun didReinitializeFirebaseCore(): Task { - val taskCompletionSource = TaskCompletionSource() + override fun didReinitializeFirebaseCore(): Task { + val taskCompletionSource = TaskCompletionSource() FlutterFirebasePlugin.cachedThreadPool.execute { try { diff --git a/packages/firebase_performance/firebase_performance/ios/firebase_performance/Sources/firebase_performance/FirebasePerformancePlugin.swift b/packages/firebase_performance/firebase_performance/ios/firebase_performance/Sources/firebase_performance/FirebasePerformancePlugin.swift index 6d0ac5c39979..99397b2f272c 100644 --- a/packages/firebase_performance/firebase_performance/ios/firebase_performance/Sources/firebase_performance/FirebasePerformancePlugin.swift +++ b/packages/firebase_performance/firebase_performance/ios/firebase_performance/Sources/firebase_performance/FirebasePerformancePlugin.swift @@ -13,31 +13,32 @@ #else import firebase_core_shared #endif +import FirebaseCore import FirebasePerformance let FirebasePerformanceChannelName = "plugins.flutter.io/firebase_performance" extension FlutterError: Error {} -public class FirebasePerformancePlugin: NSObject, FlutterPlugin, FLTFirebasePluginProtocol, +public class FirebasePerformancePlugin: NSObject, FlutterPlugin, FLTFirebasePlugin, FirebasePerformanceHostApi { public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { completion() } - public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + public func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] { [:] } - public func firebaseLibraryName() -> String { + public var firebaseLibraryName: String { "flutter-fire-perf" } - public func firebaseLibraryVersion() -> String { + public var firebaseLibraryVersion: String { versionNumber } - public func flutterChannelName() -> String { + public var flutterChannelName: String { FirebasePerformanceChannelName } diff --git a/packages/firebase_remote_config/firebase_remote_config/android/src/main/kotlin/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.kt b/packages/firebase_remote_config/firebase_remote_config/android/src/main/kotlin/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.kt index 2700a45258cb..598f7d0d718a 100644 --- a/packages/firebase_remote_config/firebase_remote_config/android/src/main/kotlin/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.kt +++ b/packages/firebase_remote_config/firebase_remote_config/android/src/main/kotlin/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.kt @@ -79,8 +79,8 @@ class FirebaseRemoteConfigPlugin return configProperties } - override fun didReinitializeFirebaseCore(): Task { - val taskCompletionSource = TaskCompletionSource() + override fun didReinitializeFirebaseCore(): Task { + val taskCompletionSource = TaskCompletionSource() FlutterFirebasePlugin.cachedThreadPool.execute { try { diff --git a/packages/firebase_remote_config/firebase_remote_config/ios/firebase_remote_config/Sources/firebase_remote_config/FirebaseRemoteConfigPlugin.swift b/packages/firebase_remote_config/firebase_remote_config/ios/firebase_remote_config/Sources/firebase_remote_config/FirebaseRemoteConfigPlugin.swift index efc37811db97..f3f98478bd5a 100644 --- a/packages/firebase_remote_config/firebase_remote_config/ios/firebase_remote_config/Sources/firebase_remote_config/FirebaseRemoteConfigPlugin.swift +++ b/packages/firebase_remote_config/firebase_remote_config/ios/firebase_remote_config/Sources/firebase_remote_config/FirebaseRemoteConfigPlugin.swift @@ -13,6 +13,7 @@ #else import firebase_core_shared #endif +import FirebaseCore import FirebaseRemoteConfig let kFirebaseRemoteConfigChannelName = "plugins.flutter.io/firebase_remote_config" @@ -21,13 +22,13 @@ let kFirebaseRemoteConfigUpdatedChannelName = "plugins.flutter.io/firebase_remot extension FlutterError: Error {} public class FirebaseRemoteConfigPlugin: NSObject, FlutterPlugin, FlutterStreamHandler, - FLTFirebasePluginProtocol, FirebaseRemoteConfigHostApi { + FLTFirebasePlugin, FirebaseRemoteConfigHostApi { private var listenersMap: [String: ConfigUpdateListenerRegistration] = [:] private var fetchAndActivateRetry = false static let shared: FirebaseRemoteConfigPlugin = { let instance = FirebaseRemoteConfigPlugin() - FLTFirebasePluginRegistry.sharedInstance().register(instance) + FLTFirebasePluginRegistry.sharedInstance().registerFirebasePlugin(instance) instance.fetchAndActivateRetry = false return instance }() @@ -53,8 +54,8 @@ public class FirebaseRemoteConfigPlugin: NSObject, FlutterPlugin, FlutterStreamH if FirebaseApp.responds(to: NSSelectorFromString("registerLibrary:withVersion:")) { FirebaseApp.perform( NSSelectorFromString("registerLibrary:withVersion:"), - with: instance.firebaseLibraryName(), - with: instance.firebaseLibraryVersion() + with: instance.firebaseLibraryName, + with: instance.firebaseLibraryVersion ) } } @@ -63,7 +64,7 @@ public class FirebaseRemoteConfigPlugin: NSObject, FlutterPlugin, FlutterStreamH completion() } - public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + public func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] { let firebaseRemoteConfig = RemoteConfig.remoteConfig(app: firebaseApp) let configProperties = configProperties(for: firebaseRemoteConfig) var configValues: [String: Any] = configProperties @@ -173,15 +174,15 @@ public class FirebaseRemoteConfigPlugin: NSObject, FlutterPlugin, FlutterStreamH completion(.success(configProperties(for: config))) } - public func firebaseLibraryName() -> String { + public var firebaseLibraryName: String { "flutter-fire-rc" } - public func firebaseLibraryVersion() -> String { + public var firebaseLibraryVersion: String { versionNumber } - public func flutterChannelName() -> String { + public var flutterChannelName: String { kFirebaseRemoteConfigChannelName } From 44fda0bc3fd023c24ee5a3a79ca6cefe9cccf339 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Tue, 4 Nov 2025 15:58:48 +0000 Subject: [PATCH 06/17] fix(storage): Merge storage Kotlin refactor and fix compilation errors --- .../firebase_storage/android/build.gradle | 16 + .../storage/FlutterFirebaseAppRegistrar.java | 21 - .../FlutterFirebaseStorageException.java | 87 - .../storage/FlutterFirebaseStoragePlugin.java | 719 -------- .../storage/FlutterFirebaseStorageTask.java | 216 --- .../GeneratedAndroidFirebaseStorage.java | 1506 ----------------- .../TaskStateChannelStreamHandler.java | 136 -- .../storage/FlutterFirebaseAppRegistrar.kt | 22 + .../FlutterFirebaseStorageException.kt | 70 + .../storage/FlutterFirebaseStoragePlugin.kt | 508 ++++++ .../storage/FlutterFirebaseStorageTask.kt | 160 ++ .../GeneratedAndroidFirebaseStorage.g.kt | 769 +++++++++ .../storage/TaskStateChannelStreamHandler.kt | 103 ++ .../ios/firebase_storage.podspec | 4 +- .../FLTFirebaseStoragePlugin.m | 986 ----------- .../FLTFirebaseStoragePlugin.swift | 390 +++++ .../FLTTaskStateChannelStreamHandler.m | 115 -- .../FirebaseStorageMessages.g.swift | 823 +++++++++ .../TaskStateChannelStreamHandler.swift | 160 ++ .../firebase_storage_messages.g.m | 866 ---------- .../include/FLTFirebaseStoragePlugin.h | 29 - .../FLTTaskStateChannelStreamHandler.h | 29 - .../include/firebase_storage_messages.g.h | 220 --- .../macos/firebase_storage.podspec | 2 +- .../FLTFirebaseStoragePlugin.m | 1 - .../FLTFirebaseStoragePlugin.swift | 1 + .../FLTTaskStateChannelStreamHandler.m | 1 - .../FirebaseStorageMessages.g.swift | 1 + .../TaskStateChannelStreamHandler.swift | 1 + .../firebase_storage_messages.g.m | 1 - .../include/FLTFirebaseStoragePlugin.h | 1 - .../FLTTaskStateChannelStreamHandler.h | 1 - .../include/firebase_storage_messages.g.h | 1 - .../firebase_storage/windows/messages.g.cpp | 2 +- .../method_channel/method_channel_task.dart | 8 +- .../pigeons/messages.dart | 13 +- tests/android/app/build.gradle | 4 +- tests/ios/Flutter/AppFrameworkInfo.plist | 2 +- 38 files changed, 3044 insertions(+), 4951 deletions(-) delete mode 100644 packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageException.java delete mode 100755 packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.java delete mode 100644 packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageTask.java delete mode 100644 packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java delete mode 100644 packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/TaskStateChannelStreamHandler.java create mode 100644 packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.kt create mode 100644 packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageException.kt create mode 100644 packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.kt create mode 100644 packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageTask.kt create mode 100644 packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.g.kt create mode 100644 packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/TaskStateChannelStreamHandler.kt delete mode 100644 packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.m create mode 100644 packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift delete mode 100644 packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTTaskStateChannelStreamHandler.m create mode 100644 packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift create mode 100644 packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/TaskStateChannelStreamHandler.swift delete mode 100644 packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m delete mode 100644 packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/FLTFirebaseStoragePlugin.h delete mode 100644 packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/FLTTaskStateChannelStreamHandler.h delete mode 100644 packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h delete mode 120000 packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.m create mode 120000 packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift delete mode 120000 packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTTaskStateChannelStreamHandler.m create mode 120000 packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift create mode 120000 packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/TaskStateChannelStreamHandler.swift delete mode 120000 packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m delete mode 120000 packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/FLTFirebaseStoragePlugin.h delete mode 120000 packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/FLTTaskStateChannelStreamHandler.h delete mode 120000 packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h diff --git a/packages/firebase_storage/firebase_storage/android/build.gradle b/packages/firebase_storage/firebase_storage/android/build.gradle index cbd0de9d4ba6..7ef42fddf333 100755 --- a/packages/firebase_storage/firebase_storage/android/build.gradle +++ b/packages/firebase_storage/firebase_storage/android/build.gradle @@ -5,10 +5,15 @@ apply plugin: 'com.android.library' apply from: file("local-config.gradle") buildscript { + ext.kotlin_version = "1.8.22" repositories { google() mavenCentral() } + dependencies { + classpath 'com.android.tools.build:gradle:8.1.4' + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") + } } rootProject.allprojects { @@ -39,6 +44,8 @@ def getRootProjectExtOrCoreProperty(name, firebaseCoreProject) { return rootProject.ext.get('FlutterFire').get(name) } +apply plugin: 'kotlin-android' + android { // Conditional for compatibility with AGP <4.2. if (project.android.hasProperty("namespace")) { @@ -52,11 +59,20 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + kotlinOptions { + jvmTarget = project.ext.javaVersion + } + compileOptions { sourceCompatibility project.ext.javaVersion targetCompatibility project.ext.javaVersion } + sourceSets { + main.java.srcDirs += "src/main/kotlin" + test.java.srcDirs += "src/test/kotlin" + } + buildFeatures { buildConfig = true } diff --git a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index 6c9664d0d36d..000000000000 --- a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.storage; - -import androidx.annotation.Keep; -import com.google.firebase.components.Component; -import com.google.firebase.components.ComponentRegistrar; -import com.google.firebase.platforminfo.LibraryVersionComponent; -import java.util.Collections; -import java.util.List; - -@Keep -public class FlutterFirebaseAppRegistrar implements ComponentRegistrar { - @Override - public List> getComponents() { - return Collections.>singletonList( - LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); - } -} diff --git a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageException.java b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageException.java deleted file mode 100644 index 184d9a38b636..000000000000 --- a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageException.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2022, the Chromium project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ - -package io.flutter.plugins.firebase.storage; - -import androidx.annotation.Nullable; -import com.google.firebase.storage.StorageException; - -class FlutterFirebaseStorageException { - static GeneratedAndroidFirebaseStorage.FlutterError parserExceptionToFlutter( - @Nullable Exception nativeException) { - if (nativeException == null) { - return new GeneratedAndroidFirebaseStorage.FlutterError( - "UNKNOWN", "An unknown error occurred", null); - } - String code = "UNKNOWN"; - String message = "An unknown error occurred:" + nativeException.getMessage(); - int codeNumber; - - if (nativeException instanceof StorageException) { - codeNumber = ((StorageException) nativeException).getErrorCode(); - code = getCode(codeNumber); - message = getMessage(codeNumber); - } - - return new GeneratedAndroidFirebaseStorage.FlutterError(code, message, null); - } - - public static String getCode(int codeNumber) { - switch (codeNumber) { - case StorageException.ERROR_OBJECT_NOT_FOUND: - return "object-not-found"; - case StorageException.ERROR_BUCKET_NOT_FOUND: - return "bucket-not-found"; - case StorageException.ERROR_PROJECT_NOT_FOUND: - return "project-not-found"; - case StorageException.ERROR_QUOTA_EXCEEDED: - return "quota-exceeded"; - case StorageException.ERROR_NOT_AUTHENTICATED: - return "unauthenticated"; - case StorageException.ERROR_NOT_AUTHORIZED: - return "unauthorized"; - case StorageException.ERROR_RETRY_LIMIT_EXCEEDED: - return "retry-limit-exceeded"; - case StorageException.ERROR_INVALID_CHECKSUM: - return "invalid-checksum"; - case StorageException.ERROR_CANCELED: - return "canceled"; - case StorageException.ERROR_UNKNOWN: - default: - { - return "unknown"; - } - } - } - - public static String getMessage(int codeNumber) { - switch (codeNumber) { - case StorageException.ERROR_OBJECT_NOT_FOUND: - return "No object exists at the desired reference."; - case StorageException.ERROR_BUCKET_NOT_FOUND: - return "No bucket is configured for Firebase Storage."; - case StorageException.ERROR_PROJECT_NOT_FOUND: - return "No project is configured for Firebase Storage."; - case StorageException.ERROR_QUOTA_EXCEEDED: - return "Quota on your Firebase Storage bucket has been exceeded."; - case StorageException.ERROR_NOT_AUTHENTICATED: - return "User is unauthenticated. Authenticate and try again."; - case StorageException.ERROR_NOT_AUTHORIZED: - return "User is not authorized to perform the desired action."; - case StorageException.ERROR_RETRY_LIMIT_EXCEEDED: - return "The maximum time limit on an operation (upload, download, delete, etc.) has been exceeded."; - case StorageException.ERROR_INVALID_CHECKSUM: - return "File on the client does not match the checksum of the file received by the server."; - case StorageException.ERROR_CANCELED: - return "User cancelled the operation."; - case StorageException.ERROR_UNKNOWN: - default: - { - return "An unknown error occurred"; - } - } - } -} diff --git a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.java b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.java deleted file mode 100755 index 916fc6968eeb..000000000000 --- a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.java +++ /dev/null @@ -1,719 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.storage; - -import android.net.Uri; -import android.util.Base64; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import com.google.android.gms.tasks.Task; -import com.google.android.gms.tasks.TaskCompletionSource; -import com.google.firebase.FirebaseApp; -import com.google.firebase.storage.FirebaseStorage; -import com.google.firebase.storage.ListResult; -import com.google.firebase.storage.StorageMetadata; -import com.google.firebase.storage.StorageReference; -import io.flutter.embedding.engine.plugins.FlutterPlugin; -import io.flutter.plugin.common.BinaryMessenger; -import io.flutter.plugin.common.EventChannel; -import io.flutter.plugin.common.EventChannel.StreamHandler; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugins.firebase.core.FlutterFirebasePlugin; -import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry; -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.UUID; - -public class FlutterFirebaseStoragePlugin - implements FlutterFirebasePlugin, - FlutterPlugin, - GeneratedAndroidFirebaseStorage.FirebaseStorageHostApi { - - private MethodChannel channel; - @Nullable private BinaryMessenger messenger; - static final String STORAGE_METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_storage"; - static final String STORAGE_TASK_EVENT_NAME = "taskEvent"; - static final String DEFAULT_ERROR_CODE = "firebase_storage"; - - static final Map eventChannels = new HashMap<>(); - static final Map streamHandlers = new HashMap<>(); - - static Map getExceptionDetails(Exception exception) { - Map details = new HashMap<>(); - GeneratedAndroidFirebaseStorage.FlutterError storageException = - FlutterFirebaseStorageException.parserExceptionToFlutter(exception); - - details.put("code", storageException.code); - details.put("message", storageException.getMessage()); - - return details; - } - - static Map parseMetadataToMap(StorageMetadata storageMetadata) { - if (storageMetadata == null) { - return null; - } - - Map out = new HashMap<>(); - if (storageMetadata.getName() != null) { - out.put("name", storageMetadata.getName()); - } - - if (storageMetadata.getBucket() != null) { - out.put("bucket", storageMetadata.getBucket()); - } - - if (storageMetadata.getGeneration() != null) { - out.put("generation", storageMetadata.getGeneration()); - } - - if (storageMetadata.getMetadataGeneration() != null) { - out.put("metadataGeneration", storageMetadata.getMetadataGeneration()); - } - - out.put("fullPath", storageMetadata.getPath()); - - out.put("size", storageMetadata.getSizeBytes()); - - out.put("creationTimeMillis", storageMetadata.getCreationTimeMillis()); - - out.put("updatedTimeMillis", storageMetadata.getUpdatedTimeMillis()); - - if (storageMetadata.getMd5Hash() != null) { - out.put("md5Hash", storageMetadata.getMd5Hash()); - } - - if (storageMetadata.getCacheControl() != null) { - out.put("cacheControl", storageMetadata.getCacheControl()); - } - - if (storageMetadata.getContentDisposition() != null) { - out.put("contentDisposition", storageMetadata.getContentDisposition()); - } - - if (storageMetadata.getContentEncoding() != null) { - out.put("contentEncoding", storageMetadata.getContentEncoding()); - } - - if (storageMetadata.getContentLanguage() != null) { - out.put("contentLanguage", storageMetadata.getContentLanguage()); - } - - if (storageMetadata.getContentType() != null) { - out.put("contentType", storageMetadata.getContentType()); - } - - Map customMetadata = new HashMap<>(); - for (String key : storageMetadata.getCustomMetadataKeys()) { - if (storageMetadata.getCustomMetadata(key) == null) { - customMetadata.put(key, ""); - } else { - customMetadata.put(key, Objects.requireNonNull(storageMetadata.getCustomMetadata(key))); - } - } - out.put("customMetadata", customMetadata); - return out; - } - - @Override - public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { - initInstance(binding.getBinaryMessenger()); - } - - @Override - public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { - FlutterFirebaseStorageTask.cancelInProgressTasks(); - channel.setMethodCallHandler(null); - assert messenger != null; - GeneratedAndroidFirebaseStorage.FirebaseStorageHostApi.setup(messenger, null); - channel = null; - messenger = null; - removeEventListeners(); - } - - private void initInstance(BinaryMessenger messenger) { - FlutterFirebasePluginRegistry.registerPlugin(STORAGE_METHOD_CHANNEL_NAME, this); - channel = new MethodChannel(messenger, STORAGE_METHOD_CHANNEL_NAME); - GeneratedAndroidFirebaseStorage.FirebaseStorageHostApi.setup(messenger, this); - this.messenger = messenger; - } - - private String registerEventChannel(String prefix, String identifier, StreamHandler handler) { - final String channelName = prefix + "/" + identifier; - - EventChannel channel = new EventChannel(messenger, channelName); - channel.setStreamHandler(handler); - eventChannels.put(identifier, channel); - streamHandlers.put(identifier, handler); - - return identifier; - } - - private synchronized void removeEventListeners() { - // Create a list to hold the keys to remove after iteration - List eventChannelKeys = new ArrayList<>(eventChannels.keySet()); - for (String identifier : eventChannelKeys) { - EventChannel eventChannel = eventChannels.get(identifier); - if (eventChannel != null) { - eventChannel.setStreamHandler(null); - } - eventChannels.remove(identifier); - } - - // Create a list to hold the keys to remove after iteration - List streamHandlerKeys = new ArrayList<>(streamHandlers.keySet()); - for (String identifier : streamHandlerKeys) { - StreamHandler streamHandler = streamHandlers.get(identifier); - if (streamHandler != null) { - streamHandler.onCancel(null); - } - streamHandlers.remove(identifier); - } - } - - private FirebaseStorage getStorageFromPigeon( - GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app) { - FirebaseApp androidApp = FirebaseApp.getInstance(app.getAppName()); - - return FirebaseStorage.getInstance(androidApp, "gs://" + app.getBucket()); - } - - private StorageReference getReferenceFromPigeon( - GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - GeneratedAndroidFirebaseStorage.PigeonStorageReference reference) { - FirebaseStorage androidStorage = getStorageFromPigeon(app); - return androidStorage.getReference(reference.getFullPath()); - } - - private GeneratedAndroidFirebaseStorage.PigeonStorageReference convertToPigeonReference( - StorageReference reference) { - return new GeneratedAndroidFirebaseStorage.PigeonStorageReference.Builder() - .setBucket(reference.getBucket()) - .setFullPath(reference.getPath()) - .setName(reference.getName()) - .build(); - } - - @Override - public void getReferencebyPath( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull String path, - @Nullable String bucket, - @NonNull - GeneratedAndroidFirebaseStorage.Result< - GeneratedAndroidFirebaseStorage.PigeonStorageReference> - result) { - StorageReference androidReference = getStorageFromPigeon(app).getReference(path); - - result.success(convertToPigeonReference(androidReference)); - } - - @Override - public void useStorageEmulator( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull String host, - @NonNull Long port, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - try { - FirebaseStorage androidStorage = getStorageFromPigeon(app); - androidStorage.useEmulator(host, port.intValue()); - result.success(null); - } catch (Exception e) { - result.error(FlutterFirebaseStorageException.parserExceptionToFlutter(e)); - } - } - - // FirebaseStorageHostApi Reference related api override - @Override - public void referenceDelete( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - FirebaseStorage firebaseStorage = getStorageFromPigeon(app); - StorageReference androidReference = firebaseStorage.getReference(reference.getFullPath()); - androidReference - .delete() - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - result.success(null); - } else { - result.error( - FlutterFirebaseStorageException.parserExceptionToFlutter(task.getException())); - } - }); - } - - @Override - public void referenceGetDownloadURL( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - FirebaseStorage firebaseStorage = getStorageFromPigeon(app); - - StorageReference androidReference = firebaseStorage.getReference(reference.getFullPath()); - androidReference - .getDownloadUrl() - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - Uri androidUrl = task.getResult(); - result.success(androidUrl.toString()); - } else { - result.error( - FlutterFirebaseStorageException.parserExceptionToFlutter(task.getException())); - } - }); - } - - @Override - public void referenceGetData( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull Long maxSize, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - FirebaseStorage firebaseStorage = getStorageFromPigeon(app); - StorageReference androidReference = firebaseStorage.getReference(reference.getFullPath()); - androidReference - .getBytes(maxSize) - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - byte[] androidData = task.getResult(); - result.success(androidData); - } else { - result.error( - FlutterFirebaseStorageException.parserExceptionToFlutter(task.getException())); - } - }); - } - - GeneratedAndroidFirebaseStorage.PigeonFullMetaData convertToPigeonMetaData( - StorageMetadata meteData) { - return new GeneratedAndroidFirebaseStorage.PigeonFullMetaData.Builder() - .setMetadata(parseMetadataToMap(meteData)) - .build(); - } - - @Override - public void referenceGetMetaData( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull - GeneratedAndroidFirebaseStorage.Result - result) { - FirebaseStorage firebaseStorage = getStorageFromPigeon(app); - StorageReference androidReference = firebaseStorage.getReference(reference.getFullPath()); - androidReference - .getMetadata() - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - StorageMetadata androidMetaData = task.getResult(); - result.success(convertToPigeonMetaData(androidMetaData)); - } else { - result.error( - FlutterFirebaseStorageException.parserExceptionToFlutter(task.getException())); - } - }); - } - - GeneratedAndroidFirebaseStorage.PigeonListResult convertToPigeonListResult( - ListResult listResult) { - List pigeonItems = new ArrayList<>(); - for (StorageReference storageReference : listResult.getItems()) { - pigeonItems.add(convertToPigeonReference(storageReference)); - } - List pigeonPrefixes = new ArrayList<>(); - for (StorageReference storageReference : listResult.getPrefixes()) { - pigeonPrefixes.add(convertToPigeonReference(storageReference)); - } - return new GeneratedAndroidFirebaseStorage.PigeonListResult.Builder() - .setItems(pigeonItems) - .setPageToken(listResult.getPageToken()) - .setPrefixs(pigeonPrefixes) - .build(); - } - - @Override - public void referenceList( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull GeneratedAndroidFirebaseStorage.PigeonListOptions options, - @NonNull - GeneratedAndroidFirebaseStorage.Result - result) { - FirebaseStorage firebaseStorage = getStorageFromPigeon(app); - StorageReference androidReference = firebaseStorage.getReference(reference.getFullPath()); - Task androidResult; - if (options.getPageToken() != null) { - androidResult = - androidReference.list(options.getMaxResults().intValue(), options.getPageToken()); - } else { - androidResult = androidReference.list(options.getMaxResults().intValue()); - } - androidResult.addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - ListResult androidListResult = task.getResult(); - result.success(convertToPigeonListResult(androidListResult)); - } else { - result.error( - FlutterFirebaseStorageException.parserExceptionToFlutter(task.getException())); - } - }); - } - - @Override - public void referenceListAll( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull - GeneratedAndroidFirebaseStorage.Result - result) { - FirebaseStorage firebaseStorage = getStorageFromPigeon(app); - StorageReference androidReference = firebaseStorage.getReference(reference.getFullPath()); - androidReference - .listAll() - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - ListResult androidListResult = task.getResult(); - result.success(convertToPigeonListResult(androidListResult)); - } else { - result.error( - FlutterFirebaseStorageException.parserExceptionToFlutter(task.getException())); - } - }); - } - - StorageMetadata getMetaDataFromPigeon( - GeneratedAndroidFirebaseStorage.PigeonSettableMetadata pigeonSettableMetatdata) { - StorageMetadata.Builder androidMetaDataBuilder = new StorageMetadata.Builder(); - - if (pigeonSettableMetatdata.getContentType() != null) { - androidMetaDataBuilder.setContentType(pigeonSettableMetatdata.getContentType()); - } - if (pigeonSettableMetatdata.getCacheControl() != null) { - androidMetaDataBuilder.setCacheControl(pigeonSettableMetatdata.getCacheControl()); - } - if (pigeonSettableMetatdata.getContentDisposition() != null) { - androidMetaDataBuilder.setContentDisposition(pigeonSettableMetatdata.getContentDisposition()); - } - if (pigeonSettableMetatdata.getContentEncoding() != null) { - androidMetaDataBuilder.setContentEncoding(pigeonSettableMetatdata.getContentEncoding()); - } - if (pigeonSettableMetatdata.getContentLanguage() != null) { - androidMetaDataBuilder.setContentLanguage(pigeonSettableMetatdata.getContentLanguage()); - } - - Map pigeonCustomMetadata = pigeonSettableMetatdata.getCustomMetadata(); - if (pigeonCustomMetadata != null) { - for (Map.Entry entry : pigeonCustomMetadata.entrySet()) { - androidMetaDataBuilder.setCustomMetadata(entry.getKey(), entry.getValue()); - } - } - - return androidMetaDataBuilder.build(); - } - - @Override - public void referenceUpdateMetadata( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull GeneratedAndroidFirebaseStorage.PigeonSettableMetadata metadata, - @NonNull - GeneratedAndroidFirebaseStorage.Result - result) { - FirebaseStorage firebaseStorage = getStorageFromPigeon(app); - StorageReference androidReference = firebaseStorage.getReference(reference.getFullPath()); - androidReference - .updateMetadata(getMetaDataFromPigeon(metadata)) - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - StorageMetadata androidMetadata = task.getResult(); - result.success(convertToPigeonMetaData(androidMetadata)); - } else { - result.error( - FlutterFirebaseStorageException.parserExceptionToFlutter(task.getException())); - } - }); - } - - @Override - public void referencePutData( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull byte[] data, - @NonNull GeneratedAndroidFirebaseStorage.PigeonSettableMetadata settableMetaData, - @NonNull Long handle, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - - StorageReference androidReference = getReferenceFromPigeon(app, reference); - StorageMetadata androidMetaData = getMetaDataFromPigeon(settableMetaData); - - FlutterFirebaseStorageTask storageTask = - FlutterFirebaseStorageTask.uploadBytes( - handle.intValue(), androidReference, data, androidMetaData); - try { - String identifier = UUID.randomUUID().toString().toLowerCase(Locale.US); - TaskStateChannelStreamHandler handler = - storageTask.startTaskWithMethodChannel(channel, identifier); - result.success( - registerEventChannel( - STORAGE_METHOD_CHANNEL_NAME + "/" + STORAGE_TASK_EVENT_NAME, identifier, handler)); - } catch (Exception e) { - result.error(FlutterFirebaseStorageException.parserExceptionToFlutter(e)); - } - } - - @Override - public void referencePutString( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull String data, - @NonNull Long format, - @NonNull GeneratedAndroidFirebaseStorage.PigeonSettableMetadata settableMetaData, - @NonNull Long handle, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - - StorageReference androidReference = getReferenceFromPigeon(app, reference); - StorageMetadata androidMetaData = getMetaDataFromPigeon(settableMetaData); - - FlutterFirebaseStorageTask storageTask = - FlutterFirebaseStorageTask.uploadBytes( - handle.intValue(), - androidReference, - stringToByteData(data, format.intValue()), - androidMetaData); - - try { - String identifier = UUID.randomUUID().toString().toLowerCase(Locale.US); - TaskStateChannelStreamHandler handler = - storageTask.startTaskWithMethodChannel(channel, identifier); - result.success( - registerEventChannel( - STORAGE_METHOD_CHANNEL_NAME + "/" + STORAGE_TASK_EVENT_NAME, identifier, handler)); - } catch (Exception e) { - result.error(FlutterFirebaseStorageException.parserExceptionToFlutter(e)); - } - } - - @Override - public void referencePutFile( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull String filePath, - @Nullable GeneratedAndroidFirebaseStorage.PigeonSettableMetadata settableMetaData, - @NonNull Long handle, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - - StorageReference androidReference = getReferenceFromPigeon(app, reference); - - FlutterFirebaseStorageTask storageTask = - FlutterFirebaseStorageTask.uploadFile( - handle.intValue(), - androidReference, - Uri.fromFile(new File(filePath)), - settableMetaData == null ? null : getMetaDataFromPigeon(settableMetaData)); - - try { - String identifier = UUID.randomUUID().toString().toLowerCase(Locale.US); - TaskStateChannelStreamHandler handler = - storageTask.startTaskWithMethodChannel(channel, identifier); - result.success( - registerEventChannel( - STORAGE_METHOD_CHANNEL_NAME + "/" + STORAGE_TASK_EVENT_NAME, identifier, handler)); - } catch (Exception e) { - result.error(FlutterFirebaseStorageException.parserExceptionToFlutter(e)); - } - } - - @Override - public void referenceDownloadFile( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, - @NonNull String filePath, - @NonNull Long handle, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - - StorageReference androidReference = getReferenceFromPigeon(app, reference); - FlutterFirebaseStorageTask storageTask = - FlutterFirebaseStorageTask.downloadFile( - handle.intValue(), androidReference, new File(filePath)); - - try { - String identifier = UUID.randomUUID().toString().toLowerCase(Locale.US); - TaskStateChannelStreamHandler handler = - storageTask.startTaskWithMethodChannel(channel, identifier); - result.success( - registerEventChannel( - STORAGE_METHOD_CHANNEL_NAME + "/" + STORAGE_TASK_EVENT_NAME, identifier, handler)); - } catch (Exception e) { - result.error(FlutterFirebaseStorageException.parserExceptionToFlutter(e)); - } - } - - // FirebaseStorageHostApi Task related api override - @Override - public void taskPause( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull Long handle, - @NonNull GeneratedAndroidFirebaseStorage.Result> result) { - - FlutterFirebaseStorageTask storageTask = - FlutterFirebaseStorageTask.getInProgressTaskForHandle(handle.intValue()); - - if (storageTask == null) { - result.error( - new GeneratedAndroidFirebaseStorage.FlutterError( - "unknown", "Pause operation was called on a task which does not exist.", null)); - return; - } - - Map statusMap = new HashMap<>(); - try { - boolean paused = storageTask.getAndroidTask().pause(); - statusMap.put("status", paused); - if (paused) { - statusMap.put( - "snapshot", FlutterFirebaseStorageTask.parseTaskSnapshot(storageTask.getSnapshot())); - } - result.success(statusMap); - } catch (Exception e) { - result.error(FlutterFirebaseStorageException.parserExceptionToFlutter(e)); - } - } - - @Override - public void taskResume( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull Long handle, - @NonNull GeneratedAndroidFirebaseStorage.Result> result) { - - FlutterFirebaseStorageTask storageTask = - FlutterFirebaseStorageTask.getInProgressTaskForHandle(handle.intValue()); - - if (storageTask == null) { - result.error( - new GeneratedAndroidFirebaseStorage.FlutterError( - "unknown", "Resume operation was called on a task which does not exist.", null)); - return; - } - - try { - boolean resumed = storageTask.getAndroidTask().resume(); - Map statusMap = new HashMap<>(); - statusMap.put("status", resumed); - if (resumed) { - statusMap.put( - "snapshot", FlutterFirebaseStorageTask.parseTaskSnapshot(storageTask.getSnapshot())); - } - result.success(statusMap); - } catch (Exception e) { - result.error(FlutterFirebaseStorageException.parserExceptionToFlutter(e)); - } - } - - @Override - public void taskCancel( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull Long handle, - @NonNull GeneratedAndroidFirebaseStorage.Result> result) { - FlutterFirebaseStorageTask storageTask = - FlutterFirebaseStorageTask.getInProgressTaskForHandle(handle.intValue()); - if (storageTask == null) { - result.error( - new GeneratedAndroidFirebaseStorage.FlutterError( - "unknown", "Cancel operation was called on a task which does not exist.", null)); - return; - } - - try { - boolean canceled = storageTask.getAndroidTask().cancel(); - Map statusMap = new HashMap<>(); - statusMap.put("status", canceled); - if (canceled) { - statusMap.put( - "snapshot", FlutterFirebaseStorageTask.parseTaskSnapshot(storageTask.getSnapshot())); - } - result.success(statusMap); - } catch (Exception e) { - result.error(FlutterFirebaseStorageException.parserExceptionToFlutter(e)); - } - } - - @Override - public void setMaxOperationRetryTime( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull Long time, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - FirebaseStorage androidStorage = getStorageFromPigeon(app); - androidStorage.setMaxOperationRetryTimeMillis(time); - result.success(null); - } - - @Override - public void setMaxUploadRetryTime( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull Long time, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - FirebaseStorage androidStorage = getStorageFromPigeon(app); - androidStorage.setMaxUploadRetryTimeMillis(time); - result.success(null); - } - - @Override - public void setMaxDownloadRetryTime( - @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, - @NonNull Long time, - @NonNull GeneratedAndroidFirebaseStorage.Result result) { - FirebaseStorage androidStorage = getStorageFromPigeon(app); - androidStorage.setMaxDownloadRetryTimeMillis(time); - result.success(null); - } - - private byte[] stringToByteData(@NonNull String data, int format) { - switch (format) { - case 1: // PutStringFormat.base64 - return Base64.decode(data, Base64.DEFAULT); - case 2: // PutStringFormat.base64Url - return Base64.decode(data, Base64.URL_SAFE); - default: - return null; - } - } - - @Override - public Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { - TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); - cachedThreadPool.execute( - () -> { - HashMap obj = new HashMap(); - taskCompletionSource.setResult(obj); - }); - - return taskCompletionSource.getTask(); - } - - @Override - public Task didReinitializeFirebaseCore() { - TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); - cachedThreadPool.execute( - () -> { - FlutterFirebaseStorageTask.cancelInProgressTasks(); - taskCompletionSource.setResult(null); - removeEventListeners(); - }); - - return taskCompletionSource.getTask(); - } -} diff --git a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageTask.java b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageTask.java deleted file mode 100644 index 42b3baebaa64..000000000000 --- a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageTask.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright 2022, the Chromium project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ - -package io.flutter.plugins.firebase.storage; - -import static io.flutter.plugins.firebase.storage.FlutterFirebaseStoragePlugin.parseMetadataToMap; - -import android.net.Uri; -import android.util.SparseArray; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import com.google.firebase.storage.FileDownloadTask; -import com.google.firebase.storage.StorageMetadata; -import com.google.firebase.storage.StorageReference; -import com.google.firebase.storage.StorageTask; -import com.google.firebase.storage.UploadTask; -import io.flutter.plugin.common.MethodChannel; -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -class FlutterFirebaseStorageTask { - static final SparseArray inProgressTasks = new SparseArray<>(); - private final FlutterFirebaseStorageTaskType type; - private final int handle; - private final StorageReference reference; - private final byte[] bytes; - private final Uri fileUri; - private final StorageMetadata metadata; - private final Object pauseSyncObject = new Object(); - private final Object resumeSyncObject = new Object(); - private final Object cancelSyncObject = new Object(); - private StorageTask storageTask; - private Boolean destroyed = false; - - private FlutterFirebaseStorageTask( - FlutterFirebaseStorageTaskType type, - int handle, - StorageReference reference, - @Nullable byte[] bytes, - @Nullable Uri fileUri, - @Nullable StorageMetadata metadata) { - this.type = type; - this.handle = handle; - this.reference = reference; - this.bytes = bytes; - this.fileUri = fileUri; - this.metadata = metadata; - synchronized (inProgressTasks) { - inProgressTasks.put(handle, this); - } - } - - @Nullable - static FlutterFirebaseStorageTask getInProgressTaskForHandle(int handle) { - synchronized (inProgressTasks) { - return inProgressTasks.get(handle); - } - } - - static void cancelInProgressTasks() { - synchronized (inProgressTasks) { - for (int i = 0; i < inProgressTasks.size(); i++) { - FlutterFirebaseStorageTask task = null; - task = inProgressTasks.valueAt(i); - if (task != null) { - task.destroy(); - } - } - - inProgressTasks.clear(); - } - } - - public static FlutterFirebaseStorageTask uploadBytes( - int handle, StorageReference reference, byte[] data, @Nullable StorageMetadata metadata) { - return new FlutterFirebaseStorageTask( - FlutterFirebaseStorageTaskType.BYTES, handle, reference, data, null, metadata); - } - - public static FlutterFirebaseStorageTask uploadFile( - int handle, - StorageReference reference, - @NonNull Uri fileUri, - @Nullable StorageMetadata metadata) { - return new FlutterFirebaseStorageTask( - FlutterFirebaseStorageTaskType.FILE, handle, reference, null, fileUri, metadata); - } - - public static FlutterFirebaseStorageTask downloadFile( - int handle, StorageReference reference, @NonNull File file) { - return new FlutterFirebaseStorageTask( - FlutterFirebaseStorageTaskType.DOWNLOAD, handle, reference, null, Uri.fromFile(file), null); - } - - public static Map parseUploadTaskSnapshot(UploadTask.TaskSnapshot snapshot) { - Map out = new HashMap<>(); - out.put("path", snapshot.getStorage().getPath()); - out.put("bytesTransferred", snapshot.getBytesTransferred()); - out.put("totalBytes", snapshot.getTotalByteCount()); - if (snapshot.getMetadata() != null) { - out.put("metadata", parseMetadataToMap(snapshot.getMetadata())); - } - return out; - } - - public static Map parseDownloadTaskSnapshot( - FileDownloadTask.TaskSnapshot snapshot) { - Map out = new HashMap<>(); - out.put("path", snapshot.getStorage().getPath()); - if (snapshot.getTask().isSuccessful()) { - // TODO(Salakar): work around a bug on the Firebase Android SDK where - // sometimes `getBytesTransferred` != `getTotalByteCount` even - // when download has completed. - out.put("bytesTransferred", snapshot.getTotalByteCount()); - } else { - out.put("bytesTransferred", snapshot.getBytesTransferred()); - } - out.put("totalBytes", snapshot.getTotalByteCount()); - return out; - } - - static Map parseTaskSnapshot(Object snapshot) { - if (snapshot instanceof FileDownloadTask.TaskSnapshot) { - return parseDownloadTaskSnapshot((FileDownloadTask.TaskSnapshot) snapshot); - } else { - return parseUploadTaskSnapshot((UploadTask.TaskSnapshot) snapshot); - } - } - - void destroy() { - if (destroyed) return; - destroyed = true; - - synchronized (inProgressTasks) { - if (storageTask.isInProgress() || storageTask.isPaused()) { - storageTask.cancel(); - } - inProgressTasks.remove(handle); - } - - synchronized (cancelSyncObject) { - cancelSyncObject.notifyAll(); - } - - synchronized (pauseSyncObject) { - pauseSyncObject.notifyAll(); - } - - synchronized (resumeSyncObject) { - resumeSyncObject.notifyAll(); - } - } - - TaskStateChannelStreamHandler startTaskWithMethodChannel( - @NonNull MethodChannel channel, @NonNull String identifier) throws Exception { - if (type == FlutterFirebaseStorageTaskType.BYTES && bytes != null) { - if (metadata == null) { - storageTask = reference.putBytes(bytes); - } else { - storageTask = reference.putBytes(bytes, metadata); - } - } else if (type == FlutterFirebaseStorageTaskType.FILE && fileUri != null) { - if (metadata == null) { - storageTask = reference.putFile(fileUri); - } else { - storageTask = reference.putFile(fileUri, metadata); - } - } else if (type == FlutterFirebaseStorageTaskType.DOWNLOAD && fileUri != null) { - storageTask = reference.getFile(fileUri); - } else { - throw new Exception("Unable to start task. Some arguments have no been initialized."); - } - - return new TaskStateChannelStreamHandler(this, reference.getStorage(), storageTask, identifier); - } - - public Object getSnapshot() { - return storageTask.getSnapshot(); - } - - public boolean isDestroyed() { - return destroyed; - } - - public void notifyResumeObjects() { - synchronized (resumeSyncObject) { - resumeSyncObject.notifyAll(); - } - } - - public void notifyCancelObjects() { - synchronized (cancelSyncObject) { - cancelSyncObject.notifyAll(); - } - } - - public void notifyPauseObjects() { - synchronized (pauseSyncObject) { - pauseSyncObject.notifyAll(); - } - } - - public StorageTask getAndroidTask() { - return storageTask; - } - - private enum FlutterFirebaseStorageTaskType { - FILE, - BYTES, - DOWNLOAD, - } -} diff --git a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java deleted file mode 100644 index d3a167febc03..000000000000 --- a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java +++ /dev/null @@ -1,1506 +0,0 @@ -// Copyright 2023, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// Autogenerated from Pigeon (v11.0.1), do not edit directly. -// See also: https://pub.dev/packages/pigeon - -package io.flutter.plugins.firebase.storage; - -import android.util.Log; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import io.flutter.plugin.common.BasicMessageChannel; -import io.flutter.plugin.common.BinaryMessenger; -import io.flutter.plugin.common.MessageCodec; -import io.flutter.plugin.common.StandardMessageCodec; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** Generated class from Pigeon. */ -@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) -public class GeneratedAndroidFirebaseStorage { - - /** Error class for passing custom error details to Flutter via a thrown PlatformException. */ - public static class FlutterError extends RuntimeException { - - /** The error code. */ - public final String code; - - /** The error details. Must be a datatype supported by the api codec. */ - public final Object details; - - public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { - super(message); - this.code = code; - this.details = details; - } - } - - @NonNull - protected static ArrayList wrapError(@NonNull Throwable exception) { - ArrayList errorList = new ArrayList(3); - if (exception instanceof FlutterError) { - FlutterError error = (FlutterError) exception; - errorList.add(error.code); - errorList.add(error.getMessage()); - errorList.add(error.details); - } else { - errorList.add(exception.toString()); - errorList.add(exception.getClass().getSimpleName()); - errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); - } - return errorList; - } - - /** The type of operation that generated the action code from calling [TaskState]. */ - public enum PigeonStorageTaskState { - /** Indicates the task has been paused by the user. */ - PAUSED(0), - /** Indicates the task is currently in-progress. */ - RUNNING(1), - /** Indicates the task has successfully completed. */ - SUCCESS(2), - /** Indicates the task was canceled. */ - CANCELED(3), - /** Indicates the task failed with an error. */ - ERROR(4); - - final int index; - - private PigeonStorageTaskState(final int index) { - this.index = index; - } - } - - /** Generated class from Pigeon that represents data sent in messages. */ - public static final class PigeonStorageFirebaseApp { - private @NonNull String appName; - - public @NonNull String getAppName() { - return appName; - } - - public void setAppName(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"appName\" is null."); - } - this.appName = setterArg; - } - - private @Nullable String tenantId; - - public @Nullable String getTenantId() { - return tenantId; - } - - public void setTenantId(@Nullable String setterArg) { - this.tenantId = setterArg; - } - - private @NonNull String bucket; - - public @NonNull String getBucket() { - return bucket; - } - - public void setBucket(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"bucket\" is null."); - } - this.bucket = setterArg; - } - - /** Constructor is non-public to enforce null safety; use Builder. */ - PigeonStorageFirebaseApp() {} - - public static final class Builder { - - private @Nullable String appName; - - public @NonNull Builder setAppName(@NonNull String setterArg) { - this.appName = setterArg; - return this; - } - - private @Nullable String tenantId; - - public @NonNull Builder setTenantId(@Nullable String setterArg) { - this.tenantId = setterArg; - return this; - } - - private @Nullable String bucket; - - public @NonNull Builder setBucket(@NonNull String setterArg) { - this.bucket = setterArg; - return this; - } - - public @NonNull PigeonStorageFirebaseApp build() { - PigeonStorageFirebaseApp pigeonReturn = new PigeonStorageFirebaseApp(); - pigeonReturn.setAppName(appName); - pigeonReturn.setTenantId(tenantId); - pigeonReturn.setBucket(bucket); - return pigeonReturn; - } - } - - @NonNull - public ArrayList toList() { - ArrayList toListResult = new ArrayList(3); - toListResult.add(appName); - toListResult.add(tenantId); - toListResult.add(bucket); - return toListResult; - } - - static @NonNull PigeonStorageFirebaseApp fromList(@NonNull ArrayList list) { - PigeonStorageFirebaseApp pigeonResult = new PigeonStorageFirebaseApp(); - Object appName = list.get(0); - pigeonResult.setAppName((String) appName); - Object tenantId = list.get(1); - pigeonResult.setTenantId((String) tenantId); - Object bucket = list.get(2); - pigeonResult.setBucket((String) bucket); - return pigeonResult; - } - } - - /** Generated class from Pigeon that represents data sent in messages. */ - public static final class PigeonStorageReference { - private @NonNull String bucket; - - public @NonNull String getBucket() { - return bucket; - } - - public void setBucket(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"bucket\" is null."); - } - this.bucket = setterArg; - } - - private @NonNull String fullPath; - - public @NonNull String getFullPath() { - return fullPath; - } - - public void setFullPath(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"fullPath\" is null."); - } - this.fullPath = setterArg; - } - - private @NonNull String name; - - public @NonNull String getName() { - return name; - } - - public void setName(@NonNull String setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"name\" is null."); - } - this.name = setterArg; - } - - /** Constructor is non-public to enforce null safety; use Builder. */ - PigeonStorageReference() {} - - public static final class Builder { - - private @Nullable String bucket; - - public @NonNull Builder setBucket(@NonNull String setterArg) { - this.bucket = setterArg; - return this; - } - - private @Nullable String fullPath; - - public @NonNull Builder setFullPath(@NonNull String setterArg) { - this.fullPath = setterArg; - return this; - } - - private @Nullable String name; - - public @NonNull Builder setName(@NonNull String setterArg) { - this.name = setterArg; - return this; - } - - public @NonNull PigeonStorageReference build() { - PigeonStorageReference pigeonReturn = new PigeonStorageReference(); - pigeonReturn.setBucket(bucket); - pigeonReturn.setFullPath(fullPath); - pigeonReturn.setName(name); - return pigeonReturn; - } - } - - @NonNull - public ArrayList toList() { - ArrayList toListResult = new ArrayList(3); - toListResult.add(bucket); - toListResult.add(fullPath); - toListResult.add(name); - return toListResult; - } - - static @NonNull PigeonStorageReference fromList(@NonNull ArrayList list) { - PigeonStorageReference pigeonResult = new PigeonStorageReference(); - Object bucket = list.get(0); - pigeonResult.setBucket((String) bucket); - Object fullPath = list.get(1); - pigeonResult.setFullPath((String) fullPath); - Object name = list.get(2); - pigeonResult.setName((String) name); - return pigeonResult; - } - } - - /** Generated class from Pigeon that represents data sent in messages. */ - public static final class PigeonFullMetaData { - private @Nullable Map metadata; - - public @Nullable Map getMetadata() { - return metadata; - } - - public void setMetadata(@Nullable Map setterArg) { - this.metadata = setterArg; - } - - public static final class Builder { - - private @Nullable Map metadata; - - public @NonNull Builder setMetadata(@Nullable Map setterArg) { - this.metadata = setterArg; - return this; - } - - public @NonNull PigeonFullMetaData build() { - PigeonFullMetaData pigeonReturn = new PigeonFullMetaData(); - pigeonReturn.setMetadata(metadata); - return pigeonReturn; - } - } - - @NonNull - public ArrayList toList() { - ArrayList toListResult = new ArrayList(1); - toListResult.add(metadata); - return toListResult; - } - - static @NonNull PigeonFullMetaData fromList(@NonNull ArrayList list) { - PigeonFullMetaData pigeonResult = new PigeonFullMetaData(); - Object metadata = list.get(0); - pigeonResult.setMetadata((Map) metadata); - return pigeonResult; - } - } - - /** Generated class from Pigeon that represents data sent in messages. */ - public static final class PigeonListOptions { - /** - * If set, limits the total number of `prefixes` and `items` to return. - * - *

The default and maximum maxResults is 1000. - */ - private @NonNull Long maxResults; - - public @NonNull Long getMaxResults() { - return maxResults; - } - - public void setMaxResults(@NonNull Long setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"maxResults\" is null."); - } - this.maxResults = setterArg; - } - - /** - * The nextPageToken from a previous call to list(). - * - *

If provided, listing is resumed from the previous position. - */ - private @Nullable String pageToken; - - public @Nullable String getPageToken() { - return pageToken; - } - - public void setPageToken(@Nullable String setterArg) { - this.pageToken = setterArg; - } - - /** Constructor is non-public to enforce null safety; use Builder. */ - PigeonListOptions() {} - - public static final class Builder { - - private @Nullable Long maxResults; - - public @NonNull Builder setMaxResults(@NonNull Long setterArg) { - this.maxResults = setterArg; - return this; - } - - private @Nullable String pageToken; - - public @NonNull Builder setPageToken(@Nullable String setterArg) { - this.pageToken = setterArg; - return this; - } - - public @NonNull PigeonListOptions build() { - PigeonListOptions pigeonReturn = new PigeonListOptions(); - pigeonReturn.setMaxResults(maxResults); - pigeonReturn.setPageToken(pageToken); - return pigeonReturn; - } - } - - @NonNull - public ArrayList toList() { - ArrayList toListResult = new ArrayList(2); - toListResult.add(maxResults); - toListResult.add(pageToken); - return toListResult; - } - - static @NonNull PigeonListOptions fromList(@NonNull ArrayList list) { - PigeonListOptions pigeonResult = new PigeonListOptions(); - Object maxResults = list.get(0); - pigeonResult.setMaxResults( - (maxResults == null) - ? null - : ((maxResults instanceof Integer) ? (Integer) maxResults : (Long) maxResults)); - Object pageToken = list.get(1); - pigeonResult.setPageToken((String) pageToken); - return pigeonResult; - } - } - - /** Generated class from Pigeon that represents data sent in messages. */ - public static final class PigeonSettableMetadata { - /** - * Served as the 'Cache-Control' header on object download. - * - *

See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control. - */ - private @Nullable String cacheControl; - - public @Nullable String getCacheControl() { - return cacheControl; - } - - public void setCacheControl(@Nullable String setterArg) { - this.cacheControl = setterArg; - } - - /** - * Served as the 'Content-Disposition' header on object download. - * - *

See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition. - */ - private @Nullable String contentDisposition; - - public @Nullable String getContentDisposition() { - return contentDisposition; - } - - public void setContentDisposition(@Nullable String setterArg) { - this.contentDisposition = setterArg; - } - - /** - * Served as the 'Content-Encoding' header on object download. - * - *

See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding. - */ - private @Nullable String contentEncoding; - - public @Nullable String getContentEncoding() { - return contentEncoding; - } - - public void setContentEncoding(@Nullable String setterArg) { - this.contentEncoding = setterArg; - } - - /** - * Served as the 'Content-Language' header on object download. - * - *

See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language. - */ - private @Nullable String contentLanguage; - - public @Nullable String getContentLanguage() { - return contentLanguage; - } - - public void setContentLanguage(@Nullable String setterArg) { - this.contentLanguage = setterArg; - } - - /** - * Served as the 'Content-Type' header on object download. - * - *

See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type. - */ - private @Nullable String contentType; - - public @Nullable String getContentType() { - return contentType; - } - - public void setContentType(@Nullable String setterArg) { - this.contentType = setterArg; - } - - /** Additional user-defined custom metadata. */ - private @Nullable Map customMetadata; - - public @Nullable Map getCustomMetadata() { - return customMetadata; - } - - public void setCustomMetadata(@Nullable Map setterArg) { - this.customMetadata = setterArg; - } - - public static final class Builder { - - private @Nullable String cacheControl; - - public @NonNull Builder setCacheControl(@Nullable String setterArg) { - this.cacheControl = setterArg; - return this; - } - - private @Nullable String contentDisposition; - - public @NonNull Builder setContentDisposition(@Nullable String setterArg) { - this.contentDisposition = setterArg; - return this; - } - - private @Nullable String contentEncoding; - - public @NonNull Builder setContentEncoding(@Nullable String setterArg) { - this.contentEncoding = setterArg; - return this; - } - - private @Nullable String contentLanguage; - - public @NonNull Builder setContentLanguage(@Nullable String setterArg) { - this.contentLanguage = setterArg; - return this; - } - - private @Nullable String contentType; - - public @NonNull Builder setContentType(@Nullable String setterArg) { - this.contentType = setterArg; - return this; - } - - private @Nullable Map customMetadata; - - public @NonNull Builder setCustomMetadata(@Nullable Map setterArg) { - this.customMetadata = setterArg; - return this; - } - - public @NonNull PigeonSettableMetadata build() { - PigeonSettableMetadata pigeonReturn = new PigeonSettableMetadata(); - pigeonReturn.setCacheControl(cacheControl); - pigeonReturn.setContentDisposition(contentDisposition); - pigeonReturn.setContentEncoding(contentEncoding); - pigeonReturn.setContentLanguage(contentLanguage); - pigeonReturn.setContentType(contentType); - pigeonReturn.setCustomMetadata(customMetadata); - return pigeonReturn; - } - } - - @NonNull - public ArrayList toList() { - ArrayList toListResult = new ArrayList(6); - toListResult.add(cacheControl); - toListResult.add(contentDisposition); - toListResult.add(contentEncoding); - toListResult.add(contentLanguage); - toListResult.add(contentType); - toListResult.add(customMetadata); - return toListResult; - } - - static @NonNull PigeonSettableMetadata fromList(@NonNull ArrayList list) { - PigeonSettableMetadata pigeonResult = new PigeonSettableMetadata(); - Object cacheControl = list.get(0); - pigeonResult.setCacheControl((String) cacheControl); - Object contentDisposition = list.get(1); - pigeonResult.setContentDisposition((String) contentDisposition); - Object contentEncoding = list.get(2); - pigeonResult.setContentEncoding((String) contentEncoding); - Object contentLanguage = list.get(3); - pigeonResult.setContentLanguage((String) contentLanguage); - Object contentType = list.get(4); - pigeonResult.setContentType((String) contentType); - Object customMetadata = list.get(5); - pigeonResult.setCustomMetadata((Map) customMetadata); - return pigeonResult; - } - } - - /** Generated class from Pigeon that represents data sent in messages. */ - public static final class PigeonListResult { - private @NonNull List items; - - public @NonNull List getItems() { - return items; - } - - public void setItems(@NonNull List setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"items\" is null."); - } - this.items = setterArg; - } - - private @Nullable String pageToken; - - public @Nullable String getPageToken() { - return pageToken; - } - - public void setPageToken(@Nullable String setterArg) { - this.pageToken = setterArg; - } - - private @NonNull List prefixs; - - public @NonNull List getPrefixs() { - return prefixs; - } - - public void setPrefixs(@NonNull List setterArg) { - if (setterArg == null) { - throw new IllegalStateException("Nonnull field \"prefixs\" is null."); - } - this.prefixs = setterArg; - } - - /** Constructor is non-public to enforce null safety; use Builder. */ - PigeonListResult() {} - - public static final class Builder { - - private @Nullable List items; - - public @NonNull Builder setItems(@NonNull List setterArg) { - this.items = setterArg; - return this; - } - - private @Nullable String pageToken; - - public @NonNull Builder setPageToken(@Nullable String setterArg) { - this.pageToken = setterArg; - return this; - } - - private @Nullable List prefixs; - - public @NonNull Builder setPrefixs(@NonNull List setterArg) { - this.prefixs = setterArg; - return this; - } - - public @NonNull PigeonListResult build() { - PigeonListResult pigeonReturn = new PigeonListResult(); - pigeonReturn.setItems(items); - pigeonReturn.setPageToken(pageToken); - pigeonReturn.setPrefixs(prefixs); - return pigeonReturn; - } - } - - @NonNull - public ArrayList toList() { - ArrayList toListResult = new ArrayList(3); - toListResult.add(items); - toListResult.add(pageToken); - toListResult.add(prefixs); - return toListResult; - } - - static @NonNull PigeonListResult fromList(@NonNull ArrayList list) { - PigeonListResult pigeonResult = new PigeonListResult(); - Object items = list.get(0); - pigeonResult.setItems((List) items); - Object pageToken = list.get(1); - pigeonResult.setPageToken((String) pageToken); - Object prefixs = list.get(2); - pigeonResult.setPrefixs((List) prefixs); - return pigeonResult; - } - } - - public interface Result { - @SuppressWarnings("UnknownNullness") - void success(T result); - - void error(@NonNull Throwable error); - } - - private static class FirebaseStorageHostApiCodec extends StandardMessageCodec { - public static final FirebaseStorageHostApiCodec INSTANCE = new FirebaseStorageHostApiCodec(); - - private FirebaseStorageHostApiCodec() {} - - @Override - protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { - switch (type) { - case (byte) 128: - return PigeonFullMetaData.fromList((ArrayList) readValue(buffer)); - case (byte) 129: - return PigeonListOptions.fromList((ArrayList) readValue(buffer)); - case (byte) 130: - return PigeonListResult.fromList((ArrayList) readValue(buffer)); - case (byte) 131: - return PigeonSettableMetadata.fromList((ArrayList) readValue(buffer)); - case (byte) 132: - return PigeonStorageFirebaseApp.fromList((ArrayList) readValue(buffer)); - case (byte) 133: - return PigeonStorageReference.fromList((ArrayList) readValue(buffer)); - default: - return super.readValueOfType(type, buffer); - } - } - - @Override - protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { - if (value instanceof PigeonFullMetaData) { - stream.write(128); - writeValue(stream, ((PigeonFullMetaData) value).toList()); - } else if (value instanceof PigeonListOptions) { - stream.write(129); - writeValue(stream, ((PigeonListOptions) value).toList()); - } else if (value instanceof PigeonListResult) { - stream.write(130); - writeValue(stream, ((PigeonListResult) value).toList()); - } else if (value instanceof PigeonSettableMetadata) { - stream.write(131); - writeValue(stream, ((PigeonSettableMetadata) value).toList()); - } else if (value instanceof PigeonStorageFirebaseApp) { - stream.write(132); - writeValue(stream, ((PigeonStorageFirebaseApp) value).toList()); - } else if (value instanceof PigeonStorageReference) { - stream.write(133); - writeValue(stream, ((PigeonStorageReference) value).toList()); - } else { - super.writeValue(stream, value); - } - } - } - - /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ - public interface FirebaseStorageHostApi { - - void getReferencebyPath( - @NonNull PigeonStorageFirebaseApp app, - @NonNull String path, - @Nullable String bucket, - @NonNull Result result); - - void setMaxOperationRetryTime( - @NonNull PigeonStorageFirebaseApp app, @NonNull Long time, @NonNull Result result); - - void setMaxUploadRetryTime( - @NonNull PigeonStorageFirebaseApp app, @NonNull Long time, @NonNull Result result); - - void setMaxDownloadRetryTime( - @NonNull PigeonStorageFirebaseApp app, @NonNull Long time, @NonNull Result result); - - void useStorageEmulator( - @NonNull PigeonStorageFirebaseApp app, - @NonNull String host, - @NonNull Long port, - @NonNull Result result); - - void referenceDelete( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull Result result); - - void referenceGetDownloadURL( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull Result result); - - void referenceGetMetaData( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull Result result); - - void referenceList( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull PigeonListOptions options, - @NonNull Result result); - - void referenceListAll( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull Result result); - - void referenceGetData( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull Long maxSize, - @NonNull Result result); - - void referencePutData( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull byte[] data, - @NonNull PigeonSettableMetadata settableMetaData, - @NonNull Long handle, - @NonNull Result result); - - void referencePutString( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull String data, - @NonNull Long format, - @NonNull PigeonSettableMetadata settableMetaData, - @NonNull Long handle, - @NonNull Result result); - - void referencePutFile( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull String filePath, - @Nullable PigeonSettableMetadata settableMetaData, - @NonNull Long handle, - @NonNull Result result); - - void referenceDownloadFile( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull String filePath, - @NonNull Long handle, - @NonNull Result result); - - void referenceUpdateMetadata( - @NonNull PigeonStorageFirebaseApp app, - @NonNull PigeonStorageReference reference, - @NonNull PigeonSettableMetadata metadata, - @NonNull Result result); - - void taskPause( - @NonNull PigeonStorageFirebaseApp app, - @NonNull Long handle, - @NonNull Result> result); - - void taskResume( - @NonNull PigeonStorageFirebaseApp app, - @NonNull Long handle, - @NonNull Result> result); - - void taskCancel( - @NonNull PigeonStorageFirebaseApp app, - @NonNull Long handle, - @NonNull Result> result); - - /** The codec used by FirebaseStorageHostApi. */ - static @NonNull MessageCodec getCodec() { - return FirebaseStorageHostApiCodec.INSTANCE; - } - /** - * Sets up an instance of `FirebaseStorageHostApi` to handle messages through the - * `binaryMessenger`. - */ - static void setup( - @NonNull BinaryMessenger binaryMessenger, @Nullable FirebaseStorageHostApi api) { - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.getReferencebyPath", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - String pathArg = (String) args.get(1); - String bucketArg = (String) args.get(2); - Result resultCallback = - new Result() { - public void success(PigeonStorageReference result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.getReferencebyPath(appArg, pathArg, bucketArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxOperationRetryTime", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - Number timeArg = (Number) args.get(1); - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.setMaxOperationRetryTime( - appArg, (timeArg == null) ? null : timeArg.longValue(), resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxUploadRetryTime", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - Number timeArg = (Number) args.get(1); - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.setMaxUploadRetryTime( - appArg, (timeArg == null) ? null : timeArg.longValue(), resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxDownloadRetryTime", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - Number timeArg = (Number) args.get(1); - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.setMaxDownloadRetryTime( - appArg, (timeArg == null) ? null : timeArg.longValue(), resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - String hostArg = (String) args.get(1); - Number portArg = (Number) args.get(2); - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.useStorageEmulator( - appArg, - hostArg, - (portArg == null) ? null : portArg.longValue(), - resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDelete", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referenceDelete(appArg, referenceArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetDownloadURL", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referenceGetDownloadURL(appArg, referenceArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetMetaData", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - Result resultCallback = - new Result() { - public void success(PigeonFullMetaData result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referenceGetMetaData(appArg, referenceArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - PigeonListOptions optionsArg = (PigeonListOptions) args.get(2); - Result resultCallback = - new Result() { - public void success(PigeonListResult result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referenceList(appArg, referenceArg, optionsArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceListAll", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - Result resultCallback = - new Result() { - public void success(PigeonListResult result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referenceListAll(appArg, referenceArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - Number maxSizeArg = (Number) args.get(2); - Result resultCallback = - new Result() { - public void success(byte[] result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referenceGetData( - appArg, - referenceArg, - (maxSizeArg == null) ? null : maxSizeArg.longValue(), - resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - byte[] dataArg = (byte[]) args.get(2); - PigeonSettableMetadata settableMetaDataArg = (PigeonSettableMetadata) args.get(3); - Number handleArg = (Number) args.get(4); - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referencePutData( - appArg, - referenceArg, - dataArg, - settableMetaDataArg, - (handleArg == null) ? null : handleArg.longValue(), - resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - String dataArg = (String) args.get(2); - Number formatArg = (Number) args.get(3); - PigeonSettableMetadata settableMetaDataArg = (PigeonSettableMetadata) args.get(4); - Number handleArg = (Number) args.get(5); - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referencePutString( - appArg, - referenceArg, - dataArg, - (formatArg == null) ? null : formatArg.longValue(), - settableMetaDataArg, - (handleArg == null) ? null : handleArg.longValue(), - resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - String filePathArg = (String) args.get(2); - PigeonSettableMetadata settableMetaDataArg = (PigeonSettableMetadata) args.get(3); - Number handleArg = (Number) args.get(4); - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referencePutFile( - appArg, - referenceArg, - filePathArg, - settableMetaDataArg, - (handleArg == null) ? null : handleArg.longValue(), - resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - String filePathArg = (String) args.get(2); - Number handleArg = (Number) args.get(3); - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referenceDownloadFile( - appArg, - referenceArg, - filePathArg, - (handleArg == null) ? null : handleArg.longValue(), - resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - PigeonStorageReference referenceArg = (PigeonStorageReference) args.get(1); - PigeonSettableMetadata metadataArg = (PigeonSettableMetadata) args.get(2); - Result resultCallback = - new Result() { - public void success(PigeonFullMetaData result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.referenceUpdateMetadata(appArg, referenceArg, metadataArg, resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskPause", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - Number handleArg = (Number) args.get(1); - Result> resultCallback = - new Result>() { - public void success(Map result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.taskPause( - appArg, (handleArg == null) ? null : handleArg.longValue(), resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskResume", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - Number handleArg = (Number) args.get(1); - Result> resultCallback = - new Result>() { - public void success(Map result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.taskResume( - appArg, (handleArg == null) ? null : handleArg.longValue(), resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - { - BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskCancel", - getCodec()); - if (api != null) { - channel.setMessageHandler( - (message, reply) -> { - ArrayList wrapped = new ArrayList(); - ArrayList args = (ArrayList) message; - PigeonStorageFirebaseApp appArg = (PigeonStorageFirebaseApp) args.get(0); - Number handleArg = (Number) args.get(1); - Result> resultCallback = - new Result>() { - public void success(Map result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.taskCancel( - appArg, (handleArg == null) ? null : handleArg.longValue(), resultCallback); - }); - } else { - channel.setMessageHandler(null); - } - } - } - } -} diff --git a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/TaskStateChannelStreamHandler.java b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/TaskStateChannelStreamHandler.java deleted file mode 100644 index 418245c7e893..000000000000 --- a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/TaskStateChannelStreamHandler.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2023, the Chromium project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ -package io.flutter.plugins.firebase.storage; - -import androidx.annotation.Nullable; -import com.google.firebase.storage.FirebaseStorage; -import com.google.firebase.storage.StorageException; -import com.google.firebase.storage.StorageTask; -import io.flutter.plugin.common.EventChannel; -import io.flutter.plugin.common.EventChannel.EventSink; -import io.flutter.plugin.common.EventChannel.StreamHandler; -import java.util.HashMap; -import java.util.Map; - -public class TaskStateChannelStreamHandler implements StreamHandler { - private final FlutterFirebaseStorageTask flutterTask; - private final FirebaseStorage androidStorage; - private final StorageTask androidTask; - private final String identifier; - - private final String TASK_STATE_NAME = "taskState"; - private final String TASK_APP_NAME = "appName"; - private final String TASK_SNAPSHOT = "snapshot"; - private final String TASK_ERROR = "error"; - - public TaskStateChannelStreamHandler( - FlutterFirebaseStorageTask flutterTask, - FirebaseStorage androidStorage, - StorageTask androidTask, - String identifier) { - this.flutterTask = flutterTask; - this.androidStorage = androidStorage; - this.androidTask = androidTask; - this.identifier = identifier; - } - - @Override - public void onListen(Object arguments, EventSink events) { - androidTask.addOnProgressListener( - taskSnapshot -> { - if (flutterTask.isDestroyed()) return; - Map event = getTaskEventMap(taskSnapshot, null); - event.put( - TASK_STATE_NAME, - GeneratedAndroidFirebaseStorage.PigeonStorageTaskState.RUNNING.index); - events.success(event); - flutterTask.notifyResumeObjects(); - }); - - androidTask.addOnPausedListener( - taskSnapshot -> { - if (flutterTask.isDestroyed()) return; - Map event = getTaskEventMap(taskSnapshot, null); - event.put( - TASK_STATE_NAME, GeneratedAndroidFirebaseStorage.PigeonStorageTaskState.PAUSED.index); - events.success(event); - flutterTask.notifyPauseObjects(); - }); - - androidTask.addOnSuccessListener( - taskSnapshot -> { - if (flutterTask.isDestroyed()) return; - Map event = getTaskEventMap(taskSnapshot, null); - event.put( - TASK_STATE_NAME, - GeneratedAndroidFirebaseStorage.PigeonStorageTaskState.SUCCESS.index); - events.success(event); - flutterTask.destroy(); - }); - - androidTask.addOnCanceledListener( - () -> { - if (flutterTask.isDestroyed()) return; - Map event = getTaskEventMap(null, null); - event.put( - TASK_STATE_NAME, - // We use "Error" state as we synthetically update snapshot cancel state in cancel() method in Dart - // This is also inline with iOS which doesn't have a cancel state, only failure - GeneratedAndroidFirebaseStorage.PigeonStorageTaskState.ERROR.index); - // We need to pass an exception that the task was canceled like the other platforms - Map syntheticException = new HashMap<>(); - syntheticException.put( - "code", FlutterFirebaseStorageException.getCode(StorageException.ERROR_CANCELED)); - syntheticException.put( - "message", - FlutterFirebaseStorageException.getMessage(StorageException.ERROR_CANCELED)); - event.put(TASK_ERROR, syntheticException); - events.success(event); - flutterTask.notifyCancelObjects(); - flutterTask.destroy(); - }); - - androidTask.addOnFailureListener( - exception -> { - if (flutterTask.isDestroyed()) return; - Map event = getTaskEventMap(null, exception); - event.put( - TASK_STATE_NAME, GeneratedAndroidFirebaseStorage.PigeonStorageTaskState.ERROR.index); - events.success(event); - flutterTask.destroy(); - }); - } - - @Override - public void onCancel(Object arguments) { - if (!androidTask.isCanceled()) androidTask.cancel(); - if (!flutterTask.isDestroyed()) flutterTask.destroy(); - EventChannel eventChannel = FlutterFirebaseStoragePlugin.eventChannels.get(identifier); - - // Remove stream handler and clear the event channel - if (eventChannel != null) { - eventChannel.setStreamHandler(null); - FlutterFirebaseStoragePlugin.eventChannels.remove(identifier); - } - - if (FlutterFirebaseStoragePlugin.streamHandlers.get(identifier) != null) { - FlutterFirebaseStoragePlugin.streamHandlers.remove(identifier); - } - } - - private Map getTaskEventMap( - @Nullable Object snapshot, @Nullable Exception exception) { - Map arguments = new HashMap<>(); - arguments.put(TASK_APP_NAME, androidStorage.getApp().getName()); - if (snapshot != null) { - arguments.put(TASK_SNAPSHOT, FlutterFirebaseStorageTask.parseTaskSnapshot(snapshot)); - } - if (exception != null) { - arguments.put(TASK_ERROR, FlutterFirebaseStoragePlugin.getExceptionDetails(exception)); - } - return arguments; - } -} diff --git a/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.kt b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.kt new file mode 100644 index 000000000000..424f5d7c8ffb --- /dev/null +++ b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2019 The Chromium Authors. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.plugins.firebase.storage + +import androidx.annotation.Keep +import com.google.firebase.components.Component +import com.google.firebase.components.ComponentRegistrar +import com.google.firebase.platforminfo.LibraryVersionComponent + +@Keep +class FlutterFirebaseAppRegistrar : ComponentRegistrar { + override fun getComponents(): List> { + return listOf( + LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION) + ) + } +} + + diff --git a/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageException.kt b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageException.kt new file mode 100644 index 000000000000..db671035ee96 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageException.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2022, the Chromium project authors. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.plugins.firebase.storage + +import androidx.annotation.Nullable +import com.google.firebase.storage.StorageException + +internal object FlutterFirebaseStorageException { + @JvmStatic + fun parserExceptionToFlutter(@Nullable nativeException: Exception?): FlutterError { + if (nativeException == null) { + return FlutterError( + "UNKNOWN", + "An unknown error occurred", + null + ) + } + + var code = "UNKNOWN" + var message = "An unknown error occurred:" + nativeException.message + var codeNumber: Int + + if (nativeException is StorageException) { + codeNumber = nativeException.errorCode + code = getCode(codeNumber) + message = getMessage(codeNumber) + } + + return FlutterError(code, message, null) + } + + @JvmStatic + fun getCode(codeNumber: Int): String { + return when (codeNumber) { + StorageException.ERROR_OBJECT_NOT_FOUND -> "object-not-found" + StorageException.ERROR_BUCKET_NOT_FOUND -> "bucket-not-found" + StorageException.ERROR_PROJECT_NOT_FOUND -> "project-not-found" + StorageException.ERROR_QUOTA_EXCEEDED -> "quota-exceeded" + StorageException.ERROR_NOT_AUTHENTICATED -> "unauthenticated" + StorageException.ERROR_NOT_AUTHORIZED -> "unauthorized" + StorageException.ERROR_RETRY_LIMIT_EXCEEDED -> "retry-limit-exceeded" + StorageException.ERROR_INVALID_CHECKSUM -> "invalid-checksum" + StorageException.ERROR_CANCELED -> "canceled" + StorageException.ERROR_UNKNOWN -> "unknown" + else -> "unknown" + } + } + + @JvmStatic + fun getMessage(codeNumber: Int): String { + return when (codeNumber) { + StorageException.ERROR_OBJECT_NOT_FOUND -> "No object exists at the desired reference." + StorageException.ERROR_BUCKET_NOT_FOUND -> "No bucket is configured for Firebase Storage." + StorageException.ERROR_PROJECT_NOT_FOUND -> "No project is configured for Firebase Storage." + StorageException.ERROR_QUOTA_EXCEEDED -> "Quota on your Firebase Storage bucket has been exceeded." + StorageException.ERROR_NOT_AUTHENTICATED -> "User is unauthenticated. Authenticate and try again." + StorageException.ERROR_NOT_AUTHORIZED -> "User is not authorized to perform the desired action." + StorageException.ERROR_RETRY_LIMIT_EXCEEDED -> "The maximum time limit on an operation (upload, download, delete, etc.) has been exceeded." + StorageException.ERROR_INVALID_CHECKSUM -> "File on the client does not match the checksum of the file received by the server." + StorageException.ERROR_CANCELED -> "User cancelled the operation." + StorageException.ERROR_UNKNOWN -> "An unknown error occurred" + else -> "An unknown error occurred" + } + } +} + + diff --git a/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.kt b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.kt new file mode 100644 index 000000000000..7453d5040713 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.kt @@ -0,0 +1,508 @@ +/* + * Copyright 2025, the Chromium project authors. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.plugins.firebase.storage + +import android.net.Uri +import android.util.Base64 +import androidx.annotation.NonNull +import androidx.annotation.Nullable +import com.google.android.gms.tasks.Task +import com.google.android.gms.tasks.TaskCompletionSource +import com.google.firebase.FirebaseApp +import com.google.firebase.storage.FirebaseStorage +import com.google.firebase.storage.ListResult +import com.google.firebase.storage.StorageMetadata +import com.google.firebase.storage.StorageReference +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.EventChannel +import io.flutter.plugin.common.EventChannel.StreamHandler +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugins.firebase.core.FlutterFirebasePlugin +import io.flutter.plugins.firebase.core.FlutterFirebasePlugin.cachedThreadPool +import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry +import java.io.File +import java.util.Locale +import java.util.UUID + +class FlutterFirebaseStoragePlugin : FlutterFirebasePlugin, FlutterPlugin, FirebaseStorageHostApi { + private var channel: MethodChannel? = null + private var messenger: BinaryMessenger? = null + + override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { + initInstance(binding.binaryMessenger) + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + FlutterFirebaseStorageTask.cancelInProgressTasks() + channel?.setMethodCallHandler(null) + checkNotNull(messenger) + FirebaseStorageHostApi.setUp(messenger!!, null) + channel = null + messenger = null + removeEventListeners() + } + + private fun initInstance(messenger: BinaryMessenger) { + FlutterFirebasePluginRegistry.registerPlugin(STORAGE_METHOD_CHANNEL_NAME, this) + channel = MethodChannel(messenger, STORAGE_METHOD_CHANNEL_NAME) + FirebaseStorageHostApi.setUp(messenger, this) + this.messenger = messenger + } + + private fun registerEventChannel(prefix: String, identifier: String, handler: StreamHandler): String { + val channelName = "$prefix/$identifier" + val channel = EventChannel(messenger, channelName) + channel.setStreamHandler(handler) + eventChannels[identifier] = channel + streamHandlers[identifier] = handler + return identifier + } + + @Synchronized + private fun removeEventListeners() { + val eventChannelKeys: List = ArrayList(eventChannels.keys) + for (identifier in eventChannelKeys) { + val eventChannel = eventChannels[identifier] + eventChannel?.setStreamHandler(null) + eventChannels.remove(identifier) + } + + val streamHandlerKeys: List = ArrayList(streamHandlers.keys) + for (identifier in streamHandlerKeys) { + val streamHandler = streamHandlers[identifier] + if (streamHandler is TaskStateChannelStreamHandler) { + streamHandler.onCancel(null) + } + streamHandlers.remove(identifier) + } + } + + private fun getStorageFromPigeon(app: PigeonStorageFirebaseApp): FirebaseStorage { + val androidApp = FirebaseApp.getInstance(app.appName) + return FirebaseStorage.getInstance(androidApp, "gs://${app.bucket}") + } + + private fun getReferenceFromPigeon( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference + ): StorageReference { + val androidStorage = getStorageFromPigeon(app) + return androidStorage.getReference(reference.fullPath) + } + + private fun convertToPigeonReference(reference: StorageReference): PigeonStorageReference { + return PigeonStorageReference( + bucket = reference.bucket, + fullPath = reference.path, + name = reference.name + ) + } + + private fun convertToPigeonMetaData(storageMetadata: StorageMetadata?): PigeonFullMetaData { + return PigeonFullMetaData(metadata = parseMetadataToMap(storageMetadata)) + } + + private fun convertToPigeonListResult(listResult: ListResult): PigeonListResult { + val items = listResult.items.map { convertToPigeonReference(it) } + val prefixes = listResult.prefixes.map { convertToPigeonReference(it) } + return PigeonListResult(items = items, pageToken = listResult.pageToken, prefixs = prefixes) + } + + private fun getMetaDataFromPigeon(pigeonSettableMetatdata: PigeonSettableMetadata): StorageMetadata { + val builder = StorageMetadata.Builder() + pigeonSettableMetatdata.contentType?.let { builder.setContentType(it) } + pigeonSettableMetatdata.cacheControl?.let { builder.setCacheControl(it) } + pigeonSettableMetatdata.contentDisposition?.let { builder.setContentDisposition(it) } + pigeonSettableMetatdata.contentEncoding?.let { builder.setContentEncoding(it) } + pigeonSettableMetatdata.contentLanguage?.let { builder.setContentLanguage(it) } + pigeonSettableMetatdata.customMetadata?.forEach { (k, v) -> if (k != null && v != null) builder.setCustomMetadata(k, v) } + return builder.build() + } + + private fun stringToByteData(data: String, format: Int): ByteArray? { + return when (format) { + 1 -> Base64.decode(data, Base64.DEFAULT) // base64 + 2 -> Base64.decode(data, Base64.URL_SAFE) // base64Url + else -> null + } + } + + override fun getReferencebyPath( + app: PigeonStorageFirebaseApp, + path: String, + bucket: String?, + callback: (Result) -> Unit + ) { + val androidReference = getStorageFromPigeon(app).getReference(path) + callback(Result.success(convertToPigeonReference(androidReference))) + } + + override fun useStorageEmulator( + app: PigeonStorageFirebaseApp, + host: String, + port: Long, + callback: (Result) -> Unit + ) { + try { + val storage = getStorageFromPigeon(app) + storage.useEmulator(host, port.toInt()) + callback(Result.success(Unit)) + } catch (e: Exception) { + callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(e))) + } + } + + override fun referenceDelete( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + callback: (Result) -> Unit + ) { + val androidReference = getStorageFromPigeon(app).getReference(reference.fullPath) + androidReference.delete().addOnCompleteListener { task -> + if (task.isSuccessful) callback(Result.success(Unit)) + else callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(task.exception))) + } + } + + override fun referenceGetDownloadURL( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + callback: (Result) -> Unit + ) { + val androidReference = getStorageFromPigeon(app).getReference(reference.fullPath) + androidReference.downloadUrl.addOnCompleteListener { task -> + if (task.isSuccessful) callback(Result.success(task.result.toString())) + else callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(task.exception))) + } + } + + override fun referenceGetData( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + maxSize: Long, + callback: (Result) -> Unit + ) { + val androidReference = getStorageFromPigeon(app).getReference(reference.fullPath) + androidReference.getBytes(maxSize).addOnCompleteListener { task -> + if (task.isSuccessful) callback(Result.success(task.result)) + else callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(task.exception))) + } + } + + override fun referenceGetMetaData( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + callback: (Result) -> Unit + ) { + val androidReference = getStorageFromPigeon(app).getReference(reference.fullPath) + androidReference.metadata.addOnCompleteListener { task -> + if (task.isSuccessful) callback(Result.success(convertToPigeonMetaData(task.result))) + else callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(task.exception))) + } + } + + override fun referenceList( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + options: PigeonListOptions, + callback: (Result) -> Unit + ) { + val androidReference = getStorageFromPigeon(app).getReference(reference.fullPath) + val task = if (options.pageToken != null) { + androidReference.list(options.maxResults.toInt(), options.pageToken) + } else { + androidReference.list(options.maxResults.toInt()) + } + task.addOnCompleteListener { t -> + if (t.isSuccessful) callback(Result.success(convertToPigeonListResult(t.result))) + else callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(t.exception))) + } + } + + override fun referenceListAll( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + callback: (Result) -> Unit + ) { + val androidReference = getStorageFromPigeon(app).getReference(reference.fullPath) + androidReference.listAll().addOnCompleteListener { task -> + if (task.isSuccessful) callback(Result.success(convertToPigeonListResult(task.result))) + else callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(task.exception))) + } + } + + override fun referenceUpdateMetadata( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + metadata: PigeonSettableMetadata, + callback: (Result) -> Unit + ) { + val androidReference = getStorageFromPigeon(app).getReference(reference.fullPath) + androidReference.updateMetadata(getMetaDataFromPigeon(metadata)).addOnCompleteListener { task -> + if (task.isSuccessful) callback(Result.success(convertToPigeonMetaData(task.result))) + else callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(task.exception))) + } + } + + override fun referencePutData( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + data: ByteArray, + settableMetaData: PigeonSettableMetadata, + handle: Long, + callback: (Result) -> Unit + ) { + val androidReference = getReferenceFromPigeon(app, reference) + val androidMetaData = getMetaDataFromPigeon(settableMetaData) + val storageTask = FlutterFirebaseStorageTask.uploadBytes(handle.toInt(), androidReference, data, androidMetaData) + try { + val identifier = UUID.randomUUID().toString().lowercase(Locale.US) + val handler = storageTask.startTaskWithMethodChannel(channel!!, identifier) + callback(Result.success(registerEventChannel("$STORAGE_METHOD_CHANNEL_NAME/$STORAGE_TASK_EVENT_NAME", identifier, handler))) + } catch (e: Exception) { + callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(e))) + } + } + + override fun referencePutString( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + data: String, + format: Long, + settableMetaData: PigeonSettableMetadata, + handle: Long, + callback: (Result) -> Unit + ) { + val androidReference = getReferenceFromPigeon(app, reference) + val androidMetaData = getMetaDataFromPigeon(settableMetaData) + val bytes = stringToByteData(data, format.toInt()) + val storageTask = FlutterFirebaseStorageTask.uploadBytes(handle.toInt(), androidReference, bytes!!, androidMetaData) + try { + val identifier = UUID.randomUUID().toString().lowercase(Locale.US) + val handler = storageTask.startTaskWithMethodChannel(channel!!, identifier) + callback(Result.success(registerEventChannel("$STORAGE_METHOD_CHANNEL_NAME/$STORAGE_TASK_EVENT_NAME", identifier, handler))) + } catch (e: Exception) { + callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(e))) + } + } + + override fun referencePutFile( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + filePath: String, + settableMetaData: PigeonSettableMetadata?, + handle: Long, + callback: (Result) -> Unit + ) { + val androidReference = getReferenceFromPigeon(app, reference) + val storageTask = FlutterFirebaseStorageTask.uploadFile( + handle.toInt(), + androidReference, + Uri.fromFile(File(filePath)), + settableMetaData?.let { getMetaDataFromPigeon(it) } + ) + try { + val identifier = UUID.randomUUID().toString().lowercase(Locale.US) + val handler = storageTask.startTaskWithMethodChannel(channel!!, identifier) + callback(Result.success(registerEventChannel("$STORAGE_METHOD_CHANNEL_NAME/$STORAGE_TASK_EVENT_NAME", identifier, handler))) + } catch (e: Exception) { + callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(e))) + } + } + + override fun referenceDownloadFile( + app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference, + filePath: String, + handle: Long, + callback: (Result) -> Unit + ) { + val androidReference = getReferenceFromPigeon(app, reference) + val storageTask = FlutterFirebaseStorageTask.downloadFile(handle.toInt(), androidReference, File(filePath)) + try { + val identifier = UUID.randomUUID().toString().lowercase(Locale.US) + val handler = storageTask.startTaskWithMethodChannel(channel!!, identifier) + callback(Result.success(registerEventChannel("$STORAGE_METHOD_CHANNEL_NAME/$STORAGE_TASK_EVENT_NAME", identifier, handler))) + } catch (e: Exception) { + callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(e))) + } + } + + override fun taskPause( + app: PigeonStorageFirebaseApp, + handle: Long, + callback: (Result>) -> Unit + ) { + val storageTask = FlutterFirebaseStorageTask.getInProgressTaskForHandle(handle.toInt()) + if (storageTask == null) { + val statusMap = HashMap() + statusMap["status"] = false + callback(Result.success(statusMap)) + return + } + try { + var paused = false + if (!storageTask.isPaused()) { + paused = storageTask.pause() + } + val statusMap = HashMap() + statusMap["status"] = paused + if (paused) { + statusMap["snapshot"] = FlutterFirebaseStorageTask.parseTaskSnapshot(storageTask.getSnapshot()) + } + callback(Result.success(statusMap)) + } catch (e: Exception) { + callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(e))) + } + } + + override fun taskResume( + app: PigeonStorageFirebaseApp, + handle: Long, + callback: (Result>) -> Unit + ) { + val storageTask = FlutterFirebaseStorageTask.getInProgressTaskForHandle(handle.toInt()) + if (storageTask == null) { + val statusMap = HashMap() + statusMap["status"] = false + callback(Result.success(statusMap)) + return + } + try { + var resumed = false + if (storageTask.isPaused()) { + resumed = storageTask.resume() + } + val statusMap = HashMap() + statusMap["status"] = resumed + if (resumed) { + statusMap["snapshot"] = FlutterFirebaseStorageTask.parseTaskSnapshot(storageTask.getSnapshot()) + } + callback(Result.success(statusMap)) + } catch (e: Exception) { + callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(e))) + } + } + + override fun taskCancel( + app: PigeonStorageFirebaseApp, + handle: Long, + callback: (Result>) -> Unit + ) { + val storageTask = FlutterFirebaseStorageTask.getInProgressTaskForHandle(handle.toInt()) + if (storageTask == null) { + val statusMap = HashMap() + statusMap["status"] = false + callback(Result.success(statusMap)) + return + } + try { + val canceled = storageTask.cancel() + val statusMap = HashMap() + statusMap["status"] = canceled + if (canceled) { + statusMap["snapshot"] = FlutterFirebaseStorageTask.parseTaskSnapshot(storageTask.getSnapshot()) + } + callback(Result.success(statusMap)) + } catch (e: Exception) { + callback(Result.failure(FlutterFirebaseStorageException.parserExceptionToFlutter(e))) + } + } + + override fun setMaxOperationRetryTime( + app: PigeonStorageFirebaseApp, + time: Long, + callback: (Result) -> Unit + ) { + val storage = getStorageFromPigeon(app) + storage.maxOperationRetryTimeMillis = time + callback(Result.success(Unit)) + } + + override fun setMaxUploadRetryTime( + app: PigeonStorageFirebaseApp, + time: Long, + callback: (Result) -> Unit + ) { + val storage = getStorageFromPigeon(app) + storage.maxUploadRetryTimeMillis = time + callback(Result.success(Unit)) + } + + override fun setMaxDownloadRetryTime( + app: PigeonStorageFirebaseApp, + time: Long, + callback: (Result) -> Unit + ) { + val storage = getStorageFromPigeon(app) + storage.maxDownloadRetryTimeMillis = time + callback(Result.success(Unit)) + } + + override fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp?): Task> { + val taskCompletionSource = TaskCompletionSource>() + cachedThreadPool.execute { + val obj = HashMap() + taskCompletionSource.setResult(obj) + } + return taskCompletionSource.task + } + + override fun didReinitializeFirebaseCore(): Task { + val taskCompletionSource = TaskCompletionSource() + cachedThreadPool.execute { + FlutterFirebaseStorageTask.cancelInProgressTasks() + taskCompletionSource.setResult(null) + removeEventListeners() + } + return taskCompletionSource.task + } + + companion object { + const val STORAGE_METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_storage" + const val STORAGE_TASK_EVENT_NAME = "taskEvent" + const val DEFAULT_ERROR_CODE = "firebase_storage" + + val eventChannels: MutableMap = HashMap() + val streamHandlers: MutableMap = HashMap() + + fun getExceptionDetails(exception: Exception): Map { + val storageException = FlutterFirebaseStorageException.parserExceptionToFlutter(exception) + val details: MutableMap = HashMap() + details["code"] = storageException.code + details["message"] = storageException.message ?: "" + return details + } + + fun parseMetadataToMap(storageMetadata: StorageMetadata?): Map? { + if (storageMetadata == null) return null + val out: MutableMap = HashMap() + storageMetadata.name?.let { out["name"] = it } + storageMetadata.bucket?.let { out["bucket"] = it } + storageMetadata.generation?.let { out["generation"] = it } + storageMetadata.metadataGeneration?.let { out["metadataGeneration"] = it } + out["fullPath"] = storageMetadata.path + out["size"] = storageMetadata.sizeBytes + out["creationTimeMillis"] = storageMetadata.creationTimeMillis + out["updatedTimeMillis"] = storageMetadata.updatedTimeMillis + storageMetadata.md5Hash?.let { out["md5Hash"] = it } + storageMetadata.cacheControl?.let { out["cacheControl"] = it } + storageMetadata.contentDisposition?.let { out["contentDisposition"] = it } + storageMetadata.contentEncoding?.let { out["contentEncoding"] = it } + storageMetadata.contentLanguage?.let { out["contentLanguage"] = it } + storageMetadata.contentType?.let { out["contentType"] = it } + val customMetadata: MutableMap = HashMap() + for (key in storageMetadata.customMetadataKeys) { + customMetadata[key] = storageMetadata.getCustomMetadata(key) ?: "" + } + out["customMetadata"] = customMetadata + return out + } + } +} + + diff --git a/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageTask.kt b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageTask.kt new file mode 100644 index 000000000000..1727bbde949c --- /dev/null +++ b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStorageTask.kt @@ -0,0 +1,160 @@ +/* + * Copyright 2022, the Chromium project authors. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.plugins.firebase.storage + +import android.net.Uri +import android.util.SparseArray +import androidx.annotation.NonNull +import androidx.annotation.Nullable +import com.google.firebase.storage.FileDownloadTask +import com.google.firebase.storage.StorageMetadata +import com.google.firebase.storage.StorageReference +import com.google.firebase.storage.StorageTask +import com.google.firebase.storage.UploadTask +import io.flutter.plugin.common.MethodChannel +import java.io.File +import java.util.HashMap + +internal class FlutterFirebaseStorageTask private constructor( + private val type: FlutterFirebaseStorageTaskType, + private val handle: Int, + private val reference: StorageReference, + private val bytes: ByteArray?, + private val fileUri: Uri?, + private val metadata: StorageMetadata? +) { + private val pauseSyncObject = Object() + private val resumeSyncObject = Object() + private val cancelSyncObject = Object() + private lateinit var storageTask: StorageTask<*> + private var destroyed: Boolean = false + + init { + synchronized(inProgressTasks) { inProgressTasks.put(handle, this) } + } + + fun startTaskWithMethodChannel(@NonNull channel: MethodChannel, @NonNull identifier: String): TaskStateChannelStreamHandler { + storageTask = when (type) { + FlutterFirebaseStorageTaskType.BYTES -> if (metadata == null) reference.putBytes(bytes!!) else reference.putBytes(bytes!!, metadata) + FlutterFirebaseStorageTaskType.FILE -> if (metadata == null) reference.putFile(fileUri!!) else reference.putFile(fileUri!!, metadata) + FlutterFirebaseStorageTaskType.DOWNLOAD -> reference.getFile(fileUri!!) + } + + return TaskStateChannelStreamHandler(this, reference.storage, storageTask as Any, identifier) + } + + fun getSnapshot(): Any = storageTask.snapshot + + fun pause(): Boolean = storageTask.pause() + + fun resume(): Boolean = storageTask.resume() + + fun cancel(): Boolean = storageTask.cancel() + + fun isCanceled(): Boolean = storageTask.isCanceled + + fun isInProgress(): Boolean = storageTask.isInProgress + + fun isPaused(): Boolean = storageTask.isPaused + + fun isDestroyed(): Boolean = destroyed + + fun notifyResumeObjects() { synchronized(resumeSyncObject) { resumeSyncObject.notifyAll() } } + fun notifyCancelObjects() { synchronized(cancelSyncObject) { cancelSyncObject.notifyAll() } } + fun notifyPauseObjects() { synchronized(pauseSyncObject) { pauseSyncObject.notifyAll() } } + + // Intentionally do not expose the StorageTask generic type outside this class + + fun destroy() { + if (destroyed) return + destroyed = true + + synchronized(inProgressTasks) { + if (storageTask.isInProgress || storageTask.isPaused) { + storageTask.cancel() + } + inProgressTasks.remove(handle) + } + + synchronized(cancelSyncObject) { cancelSyncObject.notifyAll() } + synchronized(pauseSyncObject) { pauseSyncObject.notifyAll() } + synchronized(resumeSyncObject) { resumeSyncObject.notifyAll() } + } + + companion object { + val inProgressTasks: SparseArray = SparseArray() + + @JvmStatic + fun getInProgressTaskForHandle(handle: Int): FlutterFirebaseStorageTask? { + synchronized(inProgressTasks) { return inProgressTasks.get(handle) } + } + + @JvmStatic + fun cancelInProgressTasks() { + synchronized(inProgressTasks) { + for (i in 0 until inProgressTasks.size()) { + val task: FlutterFirebaseStorageTask? = inProgressTasks.valueAt(i) + task?.destroy() + } + inProgressTasks.clear() + } + } + + @JvmStatic + fun uploadBytes(handle: Int, reference: StorageReference, data: ByteArray, metadata: StorageMetadata?): FlutterFirebaseStorageTask { + return FlutterFirebaseStorageTask(FlutterFirebaseStorageTaskType.BYTES, handle, reference, data, null, metadata) + } + + @JvmStatic + fun uploadFile(handle: Int, reference: StorageReference, fileUri: Uri, metadata: StorageMetadata?): FlutterFirebaseStorageTask { + return FlutterFirebaseStorageTask(FlutterFirebaseStorageTaskType.FILE, handle, reference, null, fileUri, metadata) + } + + @JvmStatic + fun downloadFile(handle: Int, reference: StorageReference, file: File): FlutterFirebaseStorageTask { + return FlutterFirebaseStorageTask(FlutterFirebaseStorageTaskType.DOWNLOAD, handle, reference, null, Uri.fromFile(file), null) + } + + @JvmStatic + fun parseUploadTaskSnapshot(snapshot: UploadTask.TaskSnapshot): Map { + val out: MutableMap = HashMap() + out["path"] = snapshot.storage.path + out["bytesTransferred"] = snapshot.bytesTransferred + out["totalBytes"] = snapshot.totalByteCount + if (snapshot.metadata != null) { + out["metadata"] = FlutterFirebaseStoragePlugin.parseMetadataToMap(snapshot.metadata!!) + } + return out + } + + @JvmStatic + fun parseDownloadTaskSnapshot(snapshot: FileDownloadTask.TaskSnapshot): Map { + val out: MutableMap = HashMap() + out["path"] = snapshot.storage.path + // Workaround: sometimes getBytesTransferred != getTotalByteCount when completed + out["bytesTransferred"] = if (snapshot.task.isSuccessful) snapshot.totalByteCount else snapshot.bytesTransferred + out["totalBytes"] = snapshot.totalByteCount + return out + } + + @JvmStatic + fun parseTaskSnapshot(snapshot: Any): Map { + return if (snapshot is FileDownloadTask.TaskSnapshot) { + parseDownloadTaskSnapshot(snapshot) + } else { + parseUploadTaskSnapshot(snapshot as UploadTask.TaskSnapshot) + } + } + } + + private enum class FlutterFirebaseStorageTaskType { + FILE, + BYTES, + DOWNLOAD + } +} + + diff --git a/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.g.kt b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.g.kt new file mode 100644 index 000000000000..66149daa3d82 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.g.kt @@ -0,0 +1,769 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v11.0.1), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +package io.flutter.plugins.firebase.storage + +import android.util.Log +import io.flutter.plugin.common.BasicMessageChannel +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.MessageCodec +import io.flutter.plugin.common.StandardMessageCodec +import java.io.ByteArrayOutputStream +import java.nio.ByteBuffer + +private fun wrapResult(result: Any?): List { + return listOf(result) +} + +private fun wrapError(exception: Throwable): List { + if (exception is FlutterError) { + return listOf( + exception.code, + exception.message, + exception.details + ) + } else { + return listOf( + exception.javaClass.simpleName, + exception.toString(), + "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) + ) + } +} + +/** + * Error class for passing custom error details to Flutter via a thrown PlatformException. + * @property code The error code. + * @property message The error message. + * @property details The error details. Must be a datatype supported by the api codec. + */ +class FlutterError ( + val code: String, + override val message: String? = null, + val details: Any? = null +) : Throwable() + +/** + * The type of operation that generated the action code from calling + * [TaskState]. + */ +enum class PigeonStorageTaskState(val raw: Int) { + /** Indicates the task has been paused by the user. */ + PAUSED(0), + /** Indicates the task is currently in-progress. */ + RUNNING(1), + /** Indicates the task has successfully completed. */ + SUCCESS(2), + /** Indicates the task was canceled. */ + CANCELED(3), + /** Indicates the task failed with an error. */ + ERROR(4); + + companion object { + fun ofRaw(raw: Int): PigeonStorageTaskState? { + return values().firstOrNull { it.raw == raw } + } + } +} + +/** Generated class from Pigeon that represents data sent in messages. */ +data class PigeonStorageFirebaseApp ( + val appName: String, + val tenantId: String? = null, + val bucket: String + +) { + companion object { + @Suppress("UNCHECKED_CAST") + fun fromList(list: List): PigeonStorageFirebaseApp { + val appName = list[0] as String + val tenantId = list[1] as String? + val bucket = list[2] as String + return PigeonStorageFirebaseApp(appName, tenantId, bucket) + } + } + fun toList(): List { + return listOf( + appName, + tenantId, + bucket, + ) + } +} + +/** Generated class from Pigeon that represents data sent in messages. */ +data class PigeonStorageReference ( + val bucket: String, + val fullPath: String, + val name: String + +) { + companion object { + @Suppress("UNCHECKED_CAST") + fun fromList(list: List): PigeonStorageReference { + val bucket = list[0] as String + val fullPath = list[1] as String + val name = list[2] as String + return PigeonStorageReference(bucket, fullPath, name) + } + } + fun toList(): List { + return listOf( + bucket, + fullPath, + name, + ) + } +} + +/** Generated class from Pigeon that represents data sent in messages. */ +data class PigeonFullMetaData ( + val metadata: Map? = null + +) { + companion object { + @Suppress("UNCHECKED_CAST") + fun fromList(list: List): PigeonFullMetaData { + val metadata = list[0] as Map? + return PigeonFullMetaData(metadata) + } + } + fun toList(): List { + return listOf( + metadata, + ) + } +} + +/** Generated class from Pigeon that represents data sent in messages. */ +data class PigeonListOptions ( + /** + * If set, limits the total number of `prefixes` and `items` to return. + * + * The default and maximum maxResults is 1000. + */ + val maxResults: Long, + /** + * The nextPageToken from a previous call to list(). + * + * If provided, listing is resumed from the previous position. + */ + val pageToken: String? = null + +) { + companion object { + @Suppress("UNCHECKED_CAST") + fun fromList(list: List): PigeonListOptions { + val maxResults = list[0].let { if (it is Int) it.toLong() else it as Long } + val pageToken = list[1] as String? + return PigeonListOptions(maxResults, pageToken) + } + } + fun toList(): List { + return listOf( + maxResults, + pageToken, + ) + } +} + +/** Generated class from Pigeon that represents data sent in messages. */ +data class PigeonSettableMetadata ( + /** + * Served as the 'Cache-Control' header on object download. + * + * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control. + */ + val cacheControl: String? = null, + /** + * Served as the 'Content-Disposition' header on object download. + * + * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition. + */ + val contentDisposition: String? = null, + /** + * Served as the 'Content-Encoding' header on object download. + * + * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding. + */ + val contentEncoding: String? = null, + /** + * Served as the 'Content-Language' header on object download. + * + * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language. + */ + val contentLanguage: String? = null, + /** + * Served as the 'Content-Type' header on object download. + * + * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type. + */ + val contentType: String? = null, + /** Additional user-defined custom metadata. */ + val customMetadata: Map? = null + +) { + companion object { + @Suppress("UNCHECKED_CAST") + fun fromList(list: List): PigeonSettableMetadata { + val cacheControl = list[0] as String? + val contentDisposition = list[1] as String? + val contentEncoding = list[2] as String? + val contentLanguage = list[3] as String? + val contentType = list[4] as String? + val customMetadata = list[5] as Map? + return PigeonSettableMetadata(cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType, customMetadata) + } + } + fun toList(): List { + return listOf( + cacheControl, + contentDisposition, + contentEncoding, + contentLanguage, + contentType, + customMetadata, + ) + } +} + +/** Generated class from Pigeon that represents data sent in messages. */ +data class PigeonListResult ( + val items: List, + val pageToken: String? = null, + val prefixs: List + +) { + companion object { + @Suppress("UNCHECKED_CAST") + fun fromList(list: List): PigeonListResult { + val items = list[0] as List + val pageToken = list[1] as String? + val prefixs = list[2] as List + return PigeonListResult(items, pageToken, prefixs) + } + } + fun toList(): List { + return listOf( + items, + pageToken, + prefixs, + ) + } +} + +@Suppress("UNCHECKED_CAST") +private object FirebaseStorageHostApiCodec : StandardMessageCodec() { + override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { + return when (type) { + 128.toByte() -> { + return (readValue(buffer) as? List)?.let { + PigeonFullMetaData.fromList(it) + } + } + 129.toByte() -> { + return (readValue(buffer) as? List)?.let { + PigeonListOptions.fromList(it) + } + } + 130.toByte() -> { + return (readValue(buffer) as? List)?.let { + PigeonListResult.fromList(it) + } + } + 131.toByte() -> { + return (readValue(buffer) as? List)?.let { + PigeonSettableMetadata.fromList(it) + } + } + 132.toByte() -> { + return (readValue(buffer) as? List)?.let { + PigeonStorageFirebaseApp.fromList(it) + } + } + 133.toByte() -> { + return (readValue(buffer) as? List)?.let { + PigeonStorageReference.fromList(it) + } + } + else -> super.readValueOfType(type, buffer) + } + } + override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { + when (value) { + is PigeonFullMetaData -> { + stream.write(128) + writeValue(stream, value.toList()) + } + is PigeonListOptions -> { + stream.write(129) + writeValue(stream, value.toList()) + } + is PigeonListResult -> { + stream.write(130) + writeValue(stream, value.toList()) + } + is PigeonSettableMetadata -> { + stream.write(131) + writeValue(stream, value.toList()) + } + is PigeonStorageFirebaseApp -> { + stream.write(132) + writeValue(stream, value.toList()) + } + is PigeonStorageReference -> { + stream.write(133) + writeValue(stream, value.toList()) + } + else -> super.writeValue(stream, value) + } + } +} + +/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ +interface FirebaseStorageHostApi { + fun getReferencebyPath(app: PigeonStorageFirebaseApp, path: String, bucket: String?, callback: (Result) -> Unit) + fun setMaxOperationRetryTime(app: PigeonStorageFirebaseApp, time: Long, callback: (Result) -> Unit) + fun setMaxUploadRetryTime(app: PigeonStorageFirebaseApp, time: Long, callback: (Result) -> Unit) + fun setMaxDownloadRetryTime(app: PigeonStorageFirebaseApp, time: Long, callback: (Result) -> Unit) + fun useStorageEmulator(app: PigeonStorageFirebaseApp, host: String, port: Long, callback: (Result) -> Unit) + fun referenceDelete(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, callback: (Result) -> Unit) + fun referenceGetDownloadURL(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, callback: (Result) -> Unit) + fun referenceGetMetaData(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, callback: (Result) -> Unit) + fun referenceList(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, options: PigeonListOptions, callback: (Result) -> Unit) + fun referenceListAll(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, callback: (Result) -> Unit) + fun referenceGetData(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, maxSize: Long, callback: (Result) -> Unit) + fun referencePutData(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, data: ByteArray, settableMetaData: PigeonSettableMetadata, handle: Long, callback: (Result) -> Unit) + fun referencePutString(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, data: String, format: Long, settableMetaData: PigeonSettableMetadata, handle: Long, callback: (Result) -> Unit) + fun referencePutFile(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, filePath: String, settableMetaData: PigeonSettableMetadata?, handle: Long, callback: (Result) -> Unit) + fun referenceDownloadFile(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, filePath: String, handle: Long, callback: (Result) -> Unit) + fun referenceUpdateMetadata(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, metadata: PigeonSettableMetadata, callback: (Result) -> Unit) + fun taskPause(app: PigeonStorageFirebaseApp, handle: Long, callback: (Result>) -> Unit) + fun taskResume(app: PigeonStorageFirebaseApp, handle: Long, callback: (Result>) -> Unit) + fun taskCancel(app: PigeonStorageFirebaseApp, handle: Long, callback: (Result>) -> Unit) + + companion object { + /** The codec used by FirebaseStorageHostApi. */ + val codec: MessageCodec by lazy { + FirebaseStorageHostApiCodec + } + /** Sets up an instance of `FirebaseStorageHostApi` to handle messages through the `binaryMessenger`. */ + @Suppress("UNCHECKED_CAST") + fun setUp(binaryMessenger: BinaryMessenger, api: FirebaseStorageHostApi?) { + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.getReferencebyPath", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val pathArg = args[1] as String + val bucketArg = args[2] as String? + api.getReferencebyPath(appArg, pathArg, bucketArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxOperationRetryTime", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val timeArg = args[1].let { if (it is Int) it.toLong() else it as Long } + api.setMaxOperationRetryTime(appArg, timeArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + reply.reply(wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxUploadRetryTime", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val timeArg = args[1].let { if (it is Int) it.toLong() else it as Long } + api.setMaxUploadRetryTime(appArg, timeArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + reply.reply(wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxDownloadRetryTime", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val timeArg = args[1].let { if (it is Int) it.toLong() else it as Long } + api.setMaxDownloadRetryTime(appArg, timeArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + reply.reply(wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val hostArg = args[1] as String + val portArg = args[2].let { if (it is Int) it.toLong() else it as Long } + api.useStorageEmulator(appArg, hostArg, portArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + reply.reply(wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDelete", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + api.referenceDelete(appArg, referenceArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + reply.reply(wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetDownloadURL", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + api.referenceGetDownloadURL(appArg, referenceArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetMetaData", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + api.referenceGetMetaData(appArg, referenceArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + val optionsArg = args[2] as PigeonListOptions + api.referenceList(appArg, referenceArg, optionsArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceListAll", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + api.referenceListAll(appArg, referenceArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + val maxSizeArg = args[2].let { if (it is Int) it.toLong() else it as Long } + api.referenceGetData(appArg, referenceArg, maxSizeArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + val dataArg = args[2] as ByteArray + val settableMetaDataArg = args[3] as PigeonSettableMetadata + val handleArg = args[4].let { if (it is Int) it.toLong() else it as Long } + api.referencePutData(appArg, referenceArg, dataArg, settableMetaDataArg, handleArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + val dataArg = args[2] as String + val formatArg = args[3].let { if (it is Int) it.toLong() else it as Long } + val settableMetaDataArg = args[4] as PigeonSettableMetadata + val handleArg = args[5].let { if (it is Int) it.toLong() else it as Long } + api.referencePutString(appArg, referenceArg, dataArg, formatArg, settableMetaDataArg, handleArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + val filePathArg = args[2] as String + val settableMetaDataArg = args[3] as PigeonSettableMetadata? + val handleArg = args[4].let { if (it is Int) it.toLong() else it as Long } + api.referencePutFile(appArg, referenceArg, filePathArg, settableMetaDataArg, handleArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + val filePathArg = args[2] as String + val handleArg = args[3].let { if (it is Int) it.toLong() else it as Long } + api.referenceDownloadFile(appArg, referenceArg, filePathArg, handleArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val referenceArg = args[1] as PigeonStorageReference + val metadataArg = args[2] as PigeonSettableMetadata + api.referenceUpdateMetadata(appArg, referenceArg, metadataArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskPause", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val handleArg = args[1].let { if (it is Int) it.toLong() else it as Long } + api.taskPause(appArg, handleArg) { result: Result> -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskResume", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val handleArg = args[1].let { if (it is Int) it.toLong() else it as Long } + api.taskResume(appArg, handleArg) { result: Result> -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskCancel", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appArg = args[0] as PigeonStorageFirebaseApp + val handleArg = args[1].let { if (it is Int) it.toLong() else it as Long } + api.taskCancel(appArg, handleArg) { result: Result> -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + } + } +} diff --git a/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/TaskStateChannelStreamHandler.kt b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/TaskStateChannelStreamHandler.kt new file mode 100644 index 000000000000..06cc7eddaadb --- /dev/null +++ b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/TaskStateChannelStreamHandler.kt @@ -0,0 +1,103 @@ +/* + * Copyright 2023, the Chromium project authors. + * Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. + */ +package io.flutter.plugins.firebase.storage + +import androidx.annotation.Nullable +import com.google.firebase.storage.FirebaseStorage +import com.google.firebase.storage.StorageException +import com.google.firebase.storage.StorageTask +import io.flutter.plugin.common.EventChannel +import io.flutter.plugin.common.EventChannel.EventSink +import io.flutter.plugin.common.EventChannel.StreamHandler +import java.util.HashMap + +internal class TaskStateChannelStreamHandler( + private val flutterTask: FlutterFirebaseStorageTask, + private val androidStorage: FirebaseStorage, + task: Any, + private val identifier: String +) : StreamHandler { + + private val androidTask: StorageTask<*> = task as StorageTask<*> + + private val TASK_STATE_NAME = "taskState" + private val TASK_APP_NAME = "appName" + private val TASK_SNAPSHOT = "snapshot" + private val TASK_ERROR = "error" + + override fun onListen(arguments: Any?, events: EventSink) { + androidTask.addOnProgressListener { taskSnapshot -> + if (flutterTask.isDestroyed()) return@addOnProgressListener + val event = getTaskEventMap(taskSnapshot, null) + event[TASK_STATE_NAME] = PigeonStorageTaskState.RUNNING.raw + events.success(event) + flutterTask.notifyResumeObjects() + } + + androidTask.addOnPausedListener { taskSnapshot -> + if (flutterTask.isDestroyed()) return@addOnPausedListener + val event = getTaskEventMap(taskSnapshot, null) + event[TASK_STATE_NAME] = PigeonStorageTaskState.PAUSED.raw + events.success(event) + flutterTask.notifyPauseObjects() + } + + androidTask.addOnSuccessListener { taskSnapshot -> + if (flutterTask.isDestroyed()) return@addOnSuccessListener + val event = getTaskEventMap(taskSnapshot, null) + event[TASK_STATE_NAME] = PigeonStorageTaskState.SUCCESS.raw + events.success(event) + flutterTask.destroy() + } + + androidTask.addOnCanceledListener { + if (flutterTask.isDestroyed()) return@addOnCanceledListener + val event = getTaskEventMap(null, null) + event[TASK_STATE_NAME] = PigeonStorageTaskState.ERROR.raw + val syntheticException: MutableMap = HashMap() + syntheticException["code"] = FlutterFirebaseStorageException.getCode(StorageException.ERROR_CANCELED) + syntheticException["message"] = FlutterFirebaseStorageException.getMessage(StorageException.ERROR_CANCELED) + event[TASK_ERROR] = syntheticException + events.success(event) + flutterTask.notifyCancelObjects() + flutterTask.destroy() + } + + androidTask.addOnFailureListener { exception -> + if (flutterTask.isDestroyed()) return@addOnFailureListener + val event = getTaskEventMap(null, exception) + event[TASK_STATE_NAME] = PigeonStorageTaskState.ERROR.raw + events.success(event) + flutterTask.destroy() + } + } + + override fun onCancel(arguments: Any?) { + if (!androidTask.isCanceled) androidTask.cancel() + if (!flutterTask.isDestroyed()) flutterTask.destroy() + val eventChannel = FlutterFirebaseStoragePlugin.eventChannels[identifier] + if (eventChannel != null) { + eventChannel.setStreamHandler(null) + FlutterFirebaseStoragePlugin.eventChannels.remove(identifier) + } + if (FlutterFirebaseStoragePlugin.streamHandlers[identifier] != null) { + FlutterFirebaseStoragePlugin.streamHandlers.remove(identifier) + } + } + + private fun getTaskEventMap(@Nullable snapshot: Any?, @Nullable exception: Exception?): MutableMap { + val arguments: MutableMap = HashMap() + arguments[TASK_APP_NAME] = androidStorage.app.name + if (snapshot != null) { + arguments[TASK_SNAPSHOT] = FlutterFirebaseStorageTask.parseTaskSnapshot(snapshot) + } + if (exception != null) { + arguments[TASK_ERROR] = FlutterFirebaseStoragePlugin.getExceptionDetails(exception) + } + return arguments + } +} + + diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage.podspec b/packages/firebase_storage/firebase_storage/ios/firebase_storage.podspec index a6a75ac99b4b..7a475510a123 100755 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage.podspec +++ b/packages/firebase_storage/firebase_storage/ios/firebase_storage.podspec @@ -25,9 +25,11 @@ Pod::Spec.new do |s| s.authors = 'The Chromium Authors' s.source = { :path => '.' } - s.source_files = 'firebase_storage/Sources/firebase_storage/**/*.{h,m}' + s.source_files = 'firebase_storage/Sources/firebase_storage/**/*.{h,m,swift}' s.public_header_files = 'firebase_storage/Sources/firebase_storage/include/*.h' + s.swift_version = '5.0' + s.ios.deployment_target = '15.0' s.dependency 'Flutter' diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.m b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.m deleted file mode 100644 index 24e972453487..000000000000 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.m +++ /dev/null @@ -1,986 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -#import - -@import FirebaseStorage; -#if __has_include() -#import -#else -#import -#endif -#import "FLTFirebaseStoragePlugin.h" -#import "FLTTaskStateChannelStreamHandler.h" - -static NSString *const kFLTFirebaseStorageChannelName = @"plugins.flutter.io/firebase_storage"; -static NSString *const kFLTFirebaseStorageKeyCacheControl = @"cacheControl"; -static NSString *const kFLTFirebaseStorageKeyContentDisposition = @"contentDisposition"; -static NSString *const kFLTFirebaseStorageKeyContentEncoding = @"contentEncoding"; -static NSString *const kFLTFirebaseStorageKeyContentLanguage = @"contentLanguage"; -static NSString *const kFLTFirebaseStorageKeyContentType = @"contentType"; -static NSString *const kFLTFirebaseStorageKeyCustomMetadata = @"customMetadata"; -static NSString *const kFLTFirebaseStorageKeyName = @"name"; -static NSString *const kFLTFirebaseStorageKeyBucket = @"bucket"; -static NSString *const kFLTFirebaseStorageKeyGeneration = @"generation"; -static NSString *const kFLTFirebaseStorageKeyMetadataGeneration = @"metadataGeneration"; -static NSString *const kFLTFirebaseStorageKeyFullPath = @"fullPath"; -static NSString *const kFLTFirebaseStorageKeySize = @"size"; -static NSString *const kFLTFirebaseStorageKeyCreationTime = @"creationTimeMillis"; -static NSString *const kFLTFirebaseStorageKeyUpdatedTime = @"updatedTimeMillis"; -static NSString *const kFLTFirebaseStorageKeyMD5Hash = @"md5Hash"; -static NSString *const kFLTFirebaseStorageKeyAppName = @"appName"; -static NSString *const kFLTFirebaseStorageKeyMaxOperationRetryTime = @"maxOperationRetryTime"; -static NSString *const kFLTFirebaseStorageKeyMaxDownloadRetryTime = @"maxDownloadRetryTime"; -static NSString *const kFLTFirebaseStorageKeyMaxUploadRetryTime = @"maxUploadRetryTime"; -static NSString *const kFLTFirebaseStorageKeyPath = @"path"; -static NSString *const kFLTFirebaseStorageKeySnapshot = @"snapshot"; -static NSString *const kFLTFirebaseStorageKeyHandle = @"handle"; -static NSString *const kFLTFirebaseStorageKeyMetadata = @"metadata"; -static NSString *const kFLTFirebaseStorageKeyPageToken = @"pageToken"; -static NSString *const kFLTFirebaseStorageKeyOptions = @"options"; -static NSString *const kFLTFirebaseStorageKeyMaxResults = @"maxResults"; -static NSString *const kFLTFirebaseStorageKeyItems = @"items"; -static NSString *const kFLTFirebaseStorageKeyPrefixes = @"prefixes"; -static NSString *const kFLTFirebaseStorageKeyNextPageToken = @"nextPageToken"; -static NSString *const kFLTFirebaseStorageKeyMaxSize = @"maxSize"; - -typedef NS_ENUM(NSUInteger, FLTFirebaseStorageTaskState) { - FLTFirebaseStorageTaskStateCancel = 0, - FLTFirebaseStorageTaskStatePause = 1, - FLTFirebaseStorageTaskStateResume = 2, -}; - -typedef NS_ENUM(NSUInteger, FLTFirebaseStorageTaskType) { - FLTFirebaseStorageTaskTypeFile = 0, - FLTFirebaseStorageTaskTypeBytes = 1, - FLTFirebaseStorageTaskTypeDownload = 2, - FLTFirebaseStorageTaskTypeString = 3, -}; - -typedef NS_ENUM(NSUInteger, FLTFirebaseStorageStringType) { - // FLTFirebaseStorageStringTypeRaw = 0, // unused - FLTFirebaseStorageStringTypeBase64 = 1, - FLTFirebaseStorageStringTypeBase64URL = 2, - // FLTFirebaseStorageStringTypeDataUrl = 3, // unused -}; - -@interface FLTFirebaseStoragePlugin () -@property(nonatomic, retain) FlutterMethodChannel *storage_method_channel; - -@end - -@implementation FLTFirebaseStoragePlugin { - NSMutableDictionary *> *_tasks; - dispatch_queue_t _callbackQueue; - NSMutableDictionary *_emulatorBooted; - NSObject *_binaryMessenger; - NSMutableDictionary *_eventChannels; - NSMutableDictionary *> *_streamHandlers; -} - -#pragma mark - FlutterPlugin - -// Returns a singleton instance of the Firebase Storage plugin. -+ (instancetype)sharedInstance:(NSObject *)messenger { - static dispatch_once_t onceToken; - static FLTFirebaseStoragePlugin *instance; - - dispatch_once(&onceToken, ^{ - instance = [[FLTFirebaseStoragePlugin alloc] init:messenger]; - // Register with the Flutter Firebase plugin registry. - [[FLTFirebasePluginRegistry sharedInstance] registerFirebasePlugin:instance]; - }); - - return instance; -} - -- (instancetype)init:(NSObject *)messenger { - self = [super init]; - if (self) { - _tasks = [NSMutableDictionary *> - dictionary]; - _callbackQueue = - dispatch_queue_create("io.flutter.plugins.firebase.storage", DISPATCH_QUEUE_SERIAL); - _emulatorBooted = [[NSMutableDictionary alloc] init]; - _binaryMessenger = messenger; - _eventChannels = [NSMutableDictionary dictionary]; - _streamHandlers = [NSMutableDictionary dictionary]; - } - return self; -} - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:kFLTFirebaseStorageChannelName - binaryMessenger:[registrar messenger]]; - - FLTFirebaseStoragePlugin *instance = - [FLTFirebaseStoragePlugin sharedInstance:[registrar messenger]]; - if (instance.storage_method_channel != nil) { - NSLog(@"FLTFirebaseStorage was already registered. If using isolates, you can safely ignore " - @"this message."); - return; - } - instance.storage_method_channel = channel; -#if TARGET_OS_OSX - // TODO(Salakar): Publish does not exist on MacOS version of FlutterPluginRegistrar. -#else - [registrar publish:instance]; -#endif - [registrar addMethodCallDelegate:instance channel:channel]; - - FirebaseStorageHostApiSetup(registrar.messenger, instance); -} - -- (void)cleanupWithCompletion:(void (^)(void))completion { - for (FlutterEventChannel *channel in self->_eventChannels.allValues) { - [channel setStreamHandler:nil]; - } - [self->_eventChannels removeAllObjects]; - for (NSObject *handler in self->_streamHandlers.allValues) { - [handler onCancelWithArguments:nil]; - } - [self->_streamHandlers removeAllObjects]; - @synchronized(self->_tasks) { - for (NSNumber *key in [self->_tasks allKeys]) { - FIRStorageObservableTask *task = self->_tasks[key]; - if (task != nil) { - [task removeAllObservers]; - [task cancel]; - } - } - [self->_tasks removeAllObjects]; - if (completion != nil) completion(); - } -} - -- (void)detachFromEngineForRegistrar:(NSObject *)registrar { - [self cleanupWithCompletion:^() { - self.storage_method_channel = nil; - }]; -} - -- (FIRStorage *_Nullable)getFIRStorageFromAppNameFromPigeon:(PigeonStorageFirebaseApp *)pigeonApp { - FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:pigeonApp.appName]; - NSString *baseString = @"gs://"; - NSString *fullURL = [baseString stringByAppendingString:pigeonApp.bucket]; - - FIRStorage *storage = [FIRStorage storageForApp:app URL:fullURL]; - - return storage; -} - -- (FIRStorageReference *_Nullable) - getFIRStorageReferenceFromPigeon:(PigeonStorageFirebaseApp *)pigeonApp - reference:(PigeonStorageReference *)reference { - FIRStorage *storage = [self getFIRStorageFromAppNameFromPigeon:pigeonApp]; - return [storage referenceWithPath:reference.fullPath]; -} - -- (FIRStorageMetadata *)getFIRStorageMetadataFromPigeon:(PigeonSettableMetadata *)pigeonMetadata { - FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] init]; - - if (pigeonMetadata.cacheControl != nil) { - metadata.cacheControl = pigeonMetadata.cacheControl; - } - if (pigeonMetadata.contentType != nil) { - metadata.contentType = pigeonMetadata.contentType; - } - if (pigeonMetadata.contentDisposition != nil) { - metadata.contentDisposition = pigeonMetadata.contentDisposition; - } - - if (pigeonMetadata.contentEncoding != nil) { - metadata.contentEncoding = pigeonMetadata.contentEncoding; - } - - if (pigeonMetadata.contentLanguage != nil) { - metadata.contentLanguage = pigeonMetadata.contentLanguage; - } - - if (pigeonMetadata.customMetadata != nil) { - metadata.customMetadata = pigeonMetadata.customMetadata; - } - - return metadata; -} - -- (PigeonStorageReference *)makePigeonStorageReference:(FIRStorageReference *)reference { - return [PigeonStorageReference makeWithBucket:reference.bucket - fullPath:reference.fullPath - name:reference.name]; -} - -#pragma mark - Firebase Storage API - -- (void)getReferencebyPathApp:(PigeonStorageFirebaseApp *)app - path:(NSString *)path - bucket:(nullable NSString *)bucket - completion:(void (^)(PigeonStorageReference *_Nullable, - FlutterError *_Nullable))completion { - FIRStorage *storage = [self getFIRStorageFromAppNameFromPigeon:app]; - FIRStorageReference *storage_ref = [storage referenceWithPath:path]; - completion([PigeonStorageReference makeWithBucket:bucket - fullPath:storage_ref.fullPath - name:storage_ref.name], - nil); -} - -- (void)setMaxOperationRetryTimeApp:(PigeonStorageFirebaseApp *)app - time:(NSNumber *)time - completion:(void (^)(FlutterError *_Nullable))completion { - FIRStorage *storage = [self getFIRStorageFromAppNameFromPigeon:app]; - if (![time isEqual:[NSNull null]]) { - storage.maxOperationRetryTime = [time longLongValue] / 1000.0; - } - completion(nil); -} - -- (void)setMaxUploadRetryTimeApp:(PigeonStorageFirebaseApp *)app - time:(NSNumber *)time - completion:(void (^)(FlutterError *_Nullable))completion { - FIRStorage *storage = [self getFIRStorageFromAppNameFromPigeon:app]; - if (![time isEqual:[NSNull null]]) { - storage.maxUploadRetryTime = [time longLongValue] / 1000.0; - } - completion(nil); -} - -- (void)setMaxDownloadRetryTimeApp:(PigeonStorageFirebaseApp *)app - time:(NSNumber *)time - completion:(void (^)(FlutterError *_Nullable))completion { - FIRStorage *storage = [self getFIRStorageFromAppNameFromPigeon:app]; - if (![time isEqual:[NSNull null]]) { - storage.maxDownloadRetryTime = [time longLongValue] / 1000.0; - } - completion(nil); -} - -- (void)useStorageEmulatorApp:(PigeonStorageFirebaseApp *)app - host:(NSString *)host - port:(NSNumber *)port - completion:(void (^)(FlutterError *_Nullable))completion { - FIRStorage *storage = [self getFIRStorageFromAppNameFromPigeon:app]; - NSNumber *emulatorKey = _emulatorBooted[app.bucket]; - - if (emulatorKey == nil) { - [storage useEmulatorWithHost:host port:[port integerValue]]; - [_emulatorBooted setObject:@(YES) forKey:app.bucket]; - } - completion(nil); -} - -- (void)referenceDeleteApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - completion:(void (^)(FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - [storage_reference deleteWithCompletion:^(NSError *error) { - completion([self FlutterErrorFromNSError:error]); - }]; -} - -- (void)referenceGetDownloadURLApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - completion: - (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - [storage_reference downloadURLWithCompletion:^(NSURL *URL, NSError *error) { - if (error != nil) { - completion(nil, [self FlutterErrorFromNSError:error]); - } else { - NSString *url = URL.absoluteString; - - if ([url rangeOfString:@":443"].location != NSNotFound) { - NSRange replaceRange = [url rangeOfString:@":443"]; - url = [url stringByReplacingCharactersInRange:replaceRange withString:@""]; - } - - completion(url, nil); - } - }]; -} - -- (void)referenceGetMetaDataApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - completion:(void (^)(PigeonFullMetaData *_Nullable, - FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - - [storage_reference metadataWithCompletion:^(FIRStorageMetadata *metadata, NSError *error) { - if (error != nil) { - completion(nil, [self FlutterErrorFromNSError:error]); - } else { - NSDictionary *dict = [FLTFirebaseStoragePlugin NSDictionaryFromFIRStorageMetadata:metadata]; - completion([PigeonFullMetaData makeWithMetadata:dict], nil); - } - }]; -} - -- (PigeonListResult *)makePigeonListResult:(FIRStorageListResult *)listResult { - NSMutableArray *items = - [NSMutableArray arrayWithCapacity:listResult.items.count]; - for (FIRStorageReference *item in listResult.items) { - [items addObject:[self makePigeonStorageReference:item]]; - } - NSMutableArray *prefixes = - [NSMutableArray arrayWithCapacity:listResult.prefixes.count]; - for (FIRStorageReference *prefix in listResult.prefixes) { - [prefixes addObject:[self makePigeonStorageReference:prefix]]; - } - return [PigeonListResult makeWithItems:items pageToken:listResult.pageToken prefixs:prefixes]; -} - -- (void)referenceListApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - options:(PigeonListOptions *)options - completion: - (void (^)(PigeonListResult *_Nullable, FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - - id result_completion = ^(FIRStorageListResult *listResult, NSError *error) { - if (error != nil) { - completion(nil, [self FlutterErrorFromNSError:error]); - } else { - completion([self makePigeonListResult:listResult], nil); - } - }; - if (options.pageToken == nil) { - [storage_reference listWithMaxResults:options.maxResults.longLongValue - completion:result_completion]; - } else { - [storage_reference listWithMaxResults:options.maxResults.longLongValue - pageToken:options.pageToken - completion:result_completion]; - } -} - -- (void)referenceListAllApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - completion: - (void (^)(PigeonListResult *_Nullable, FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - [storage_reference listAllWithCompletion:^(FIRStorageListResult *listResult, NSError *error) { - if (error != nil) { - completion(nil, [self FlutterErrorFromNSError:error]); - } else { - completion([self makePigeonListResult:listResult], nil); - } - }]; -} - -- (void)referenceGetDataApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - maxSize:(NSNumber *)maxSize - completion:(void (^)(FlutterStandardTypedData *_Nullable, - FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - - [storage_reference - dataWithMaxSize:[maxSize longLongValue] - completion:^(NSData *_Nullable data, NSError *_Nullable error) { - if (error != nil) { - completion(nil, [self FlutterErrorFromNSError:error]); - } else { - FlutterStandardTypedData *typedData; - if (data == nil) { - typedData = [FlutterStandardTypedData typedDataWithBytes:[[NSData alloc] init]]; - } else { - typedData = [FlutterStandardTypedData typedDataWithBytes:data]; - } - completion(typedData, nil); - } - }]; -} - -- (void)referencePutDataApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - data:(FlutterStandardTypedData *)data - settableMetaData:(PigeonSettableMetadata *)settableMetaData - handle:(NSNumber *)handle - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - - FIRStorageMetadata *metadata = [self getFIRStorageMetadataFromPigeon:settableMetaData]; - - FIRStorageObservableTask *task = [storage_reference putData:data.data - metadata:metadata]; - - @synchronized(self->_tasks) { - self->_tasks[handle] = task; - } - - completion([self setupTaskListeners:task handle:handle], nil); -} - -- (NSString *)setupTaskListeners:(FIRStorageObservableTask *)task handle:(NSNumber *)handle { - // Generate a random UUID to register with - NSString *uuid = [[NSUUID UUID] UUIDString]; - - // Set up task listeners - NSString *channelName = - [NSString stringWithFormat:@"%@/taskEvent/%@", kFLTFirebaseStorageChannelName, uuid]; - - FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:channelName - binaryMessenger:_binaryMessenger]; - FLTTaskStateChannelStreamHandler *handler = - [[FLTTaskStateChannelStreamHandler alloc] initWithTask:task - storagePlugin:self - channelName:channelName - handle:handle]; - [channel setStreamHandler:handler]; - - [_eventChannels setObject:channel forKey:channelName]; - [_streamHandlers setObject:handler forKey:channelName]; - - return uuid; -} - -- (void)cleanUpTask:(NSString *)channelName handle:(NSNumber *)handle { - NSObject *handler = [_streamHandlers objectForKey:channelName]; - if (handler) { - [_streamHandlers removeObjectForKey:channelName]; - } - - FlutterEventChannel *channel = [_eventChannels objectForKey:channelName]; - if (channel) { - [channel setStreamHandler:nil]; - [_eventChannels removeObjectForKey:channelName]; - } - - @synchronized(self->_tasks) { - [self->_tasks removeObjectForKey:handle]; - } -} - -- (void)referencePutStringApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - data:(NSString *)data - format:(NSNumber *)format - settableMetaData:(PigeonSettableMetadata *)settableMetaData - handle:(NSNumber *)handle - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - - NSData *formatted_data = - [self NSDataFromUploadString:data format:(FLTFirebaseStorageStringType)[format intValue]]; - FIRStorageMetadata *metadata = [self getFIRStorageMetadataFromPigeon:settableMetaData]; - - FIRStorageObservableTask *task = - [storage_reference putData:formatted_data metadata:metadata]; - - @synchronized(self->_tasks) { - self->_tasks[handle] = task; - } - - completion([self setupTaskListeners:task handle:handle], nil); -} - -- (void)referencePutFileApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - filePath:(NSString *)filePath - settableMetaData:(PigeonSettableMetadata *)settableMetaData - handle:(NSNumber *)handle - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - - NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; - FIRStorageObservableTask *task; - if (settableMetaData == nil) { - task = [storage_reference putFile:fileUrl]; - } else { - FIRStorageMetadata *metadata = [self getFIRStorageMetadataFromPigeon:settableMetaData]; - task = [storage_reference putFile:fileUrl metadata:metadata]; - } - - @synchronized(self->_tasks) { - self->_tasks[handle] = task; - } - - completion([self setupTaskListeners:task handle:handle], nil); -} - -- (void)referenceDownloadFileApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - filePath:(NSString *)filePath - handle:(NSNumber *)handle - completion: - (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - - NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; - FIRStorageObservableTask *task = - [storage_reference writeToFile:fileUrl]; - - @synchronized(self->_tasks) { - self->_tasks[handle] = task; - } - - completion([self setupTaskListeners:task handle:handle], nil); -} - -- (void)referenceUpdateMetadataApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - metadata:(PigeonSettableMetadata *)metadata - completion:(void (^)(PigeonFullMetaData *_Nullable, - FlutterError *_Nullable))completion { - FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app - reference:reference]; - FIRStorageMetadata *storage_metadata = [self getFIRStorageMetadataFromPigeon:metadata]; - - [storage_reference updateMetadata:storage_metadata - completion:^(FIRStorageMetadata *updatedMetadata, NSError *error) { - if (error != nil) { - completion(nil, [self FlutterErrorFromNSError:error]); - } else { - NSDictionary *dict = [FLTFirebaseStoragePlugin - NSDictionaryFromFIRStorageMetadata:updatedMetadata]; - completion([PigeonFullMetaData makeWithMetadata:dict], nil); - } - }]; -} - -- (void)taskPauseApp:(PigeonStorageFirebaseApp *)app - handle:(NSNumber *)handle - completion:(void (^)(NSDictionary *_Nullable, - FlutterError *_Nullable))completion { - FIRStorageObservableTask *task; - @synchronized(self->_tasks) { - task = self->_tasks[handle]; - } - if (task != nil) { - [self setState:FLTFirebaseStorageTaskStatePause - forFIRStorageObservableTask:task - withCompletion:^(BOOL success, NSDictionary *snapshotDict) { - completion( - @{ - @"status" : @(success), - @"snapshot" : (id)snapshotDict ?: [NSNull null], - }, - nil); - }]; - } else { - completion(nil, [FlutterError errorWithCode:@"unknown" - message:@"Cannot find task to pause." - details:@{}]); - } -} - -- (void)taskResumeApp:(PigeonStorageFirebaseApp *)app - handle:(NSNumber *)handle - completion:(void (^)(NSDictionary *_Nullable, - FlutterError *_Nullable))completion { - FIRStorageObservableTask *task; - @synchronized(self->_tasks) { - task = self->_tasks[handle]; - } - if (task != nil) { - [self setState:FLTFirebaseStorageTaskStateResume - forFIRStorageObservableTask:task - withCompletion:^(BOOL success, NSDictionary *snapshotDict) { - completion( - @{ - @"status" : @(success), - @"snapshot" : (id)snapshotDict ?: [NSNull null], - }, - nil); - }]; - } else { - completion(nil, [FlutterError errorWithCode:@"unknown" - message:@"Cannot find task to resume." - details:@{}]); - } -} - -- (void)taskCancelApp:(PigeonStorageFirebaseApp *)app - handle:(NSNumber *)handle - completion:(void (^)(NSDictionary *_Nullable, - FlutterError *_Nullable))completion { - FIRStorageObservableTask *task; - @synchronized(self->_tasks) { - task = self->_tasks[handle]; - } - if (task != nil) { - [self setState:FLTFirebaseStorageTaskStateCancel - forFIRStorageObservableTask:task - withCompletion:^(BOOL success, NSDictionary *snapshotDict) { - completion( - @{ - @"status" : @(success), - @"snapshot" : (id)snapshotDict ?: [NSNull null], - }, - nil); - }]; - } else { - completion(nil, [FlutterError errorWithCode:@"unknown" - message:@"Cannot find task to cancel." - details:@{}]); - } -} - -#pragma mark - Utilities - -// To match Web & Android SDKs we need to return a bool of whether a task state change was -// successful. -- (void)setState:(FLTFirebaseStorageTaskState)state - forFIRStorageObservableTask:(FIRStorageObservableTask *)task - withCompletion:(void (^)(BOOL, NSDictionary *))completion { - // Pause - if (state == FLTFirebaseStorageTaskStatePause) { - if (task.snapshot.status == FIRStorageTaskStatusResume || - task.snapshot.status == FIRStorageTaskStatusProgress || - task.snapshot.status == FIRStorageTaskStatusUnknown) { - __block NSString *pauseHandle; - __block NSString *successHandle; - __block NSString *failureHandle; - pauseHandle = - [task observeStatus:FIRStorageTaskStatusPause - handler:^(FIRStorageTaskSnapshot *snapshot) { - [task removeObserverWithHandle:pauseHandle]; - [task removeObserverWithHandle:successHandle]; - [task removeObserverWithHandle:failureHandle]; - completion(YES, [FLTFirebaseStoragePlugin parseTaskSnapshot:snapshot]); - }]; - successHandle = [task observeStatus:FIRStorageTaskStatusSuccess - handler:^(FIRStorageTaskSnapshot *snapshot) { - [task removeObserverWithHandle:pauseHandle]; - [task removeObserverWithHandle:successHandle]; - [task removeObserverWithHandle:failureHandle]; - completion(NO, nil); - }]; - failureHandle = [task observeStatus:FIRStorageTaskStatusFailure - handler:^(FIRStorageTaskSnapshot *snapshot) { - [task removeObserverWithHandle:pauseHandle]; - [task removeObserverWithHandle:successHandle]; - [task removeObserverWithHandle:failureHandle]; - completion(NO, nil); - }]; - - [task pause]; - } else { - completion(NO, nil); - } - return; - } - - // Resume - if (state == FLTFirebaseStorageTaskStateResume) { - if (task.snapshot.status == FIRStorageTaskStatusPause) { - __block NSString *resumeHandle; - __block NSString *progressHandle; - __block NSString *successHandle; - __block NSString *failureHandle; - resumeHandle = - [task observeStatus:FIRStorageTaskStatusResume - handler:^(FIRStorageTaskSnapshot *snapshot) { - [task removeObserverWithHandle:resumeHandle]; - [task removeObserverWithHandle:progressHandle]; - [task removeObserverWithHandle:successHandle]; - [task removeObserverWithHandle:failureHandle]; - completion(YES, [FLTFirebaseStoragePlugin parseTaskSnapshot:snapshot]); - }]; - progressHandle = - [task observeStatus:FIRStorageTaskStatusProgress - handler:^(FIRStorageTaskSnapshot *snapshot) { - [task removeObserverWithHandle:resumeHandle]; - [task removeObserverWithHandle:progressHandle]; - [task removeObserverWithHandle:successHandle]; - [task removeObserverWithHandle:failureHandle]; - completion(YES, [FLTFirebaseStoragePlugin parseTaskSnapshot:snapshot]); - }]; - successHandle = [task observeStatus:FIRStorageTaskStatusSuccess - handler:^(FIRStorageTaskSnapshot *snapshot) { - [task removeObserverWithHandle:resumeHandle]; - [task removeObserverWithHandle:progressHandle]; - [task removeObserverWithHandle:successHandle]; - [task removeObserverWithHandle:failureHandle]; - completion(NO, nil); - }]; - failureHandle = [task observeStatus:FIRStorageTaskStatusFailure - handler:^(FIRStorageTaskSnapshot *snapshot) { - [task removeObserverWithHandle:resumeHandle]; - [task removeObserverWithHandle:progressHandle]; - [task removeObserverWithHandle:successHandle]; - [task removeObserverWithHandle:failureHandle]; - completion(NO, nil); - }]; - [task resume]; - } else { - completion(NO, nil); - } - return; - } - - // Cancel - if (state == FLTFirebaseStorageTaskStateCancel) { - if (task.snapshot.status == FIRStorageTaskStatusPause || - task.snapshot.status == FIRStorageTaskStatusResume || - task.snapshot.status == FIRStorageTaskStatusProgress || - task.snapshot.status == FIRStorageTaskStatusUnknown) { - __block NSString *successHandle; - __block NSString *failureHandle; - successHandle = [task observeStatus:FIRStorageTaskStatusSuccess - handler:^(FIRStorageTaskSnapshot *snapshot) { - [task removeObserverWithHandle:successHandle]; - [task removeObserverWithHandle:failureHandle]; - completion(NO, nil); - }]; - failureHandle = [task - observeStatus:FIRStorageTaskStatusFailure - handler:^(FIRStorageTaskSnapshot *snapshot) { - [task removeObserverWithHandle:successHandle]; - [task removeObserverWithHandle:failureHandle]; - - if (snapshot.error && snapshot.error && snapshot.error.userInfo) { - // For UploadTask, the error code is found in the userInfo - // We use it to match this: - // https://github.com/firebase/firebase-ios-sdk/blob/main/FirebaseStorage/Sources/StorageError.swift#L37 - NSNumber *responseErrorCode = snapshot.error.userInfo[@"ResponseErrorCode"]; - if ([responseErrorCode integerValue] == FIRStorageErrorCodeCancelled || - snapshot.error.code == FIRStorageErrorCodeCancelled) { - completion(YES, [FLTFirebaseStoragePlugin parseTaskSnapshot:snapshot]); - return; - } - } - - completion(NO, nil); - }]; - [task cancel]; - } else { - completion(NO, nil); - } - return; - } - - completion(NO, nil); -} - -+ (NSDictionary *)NSDictionaryFromNSError:(NSError *)error { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - NSString *code = @"unknown"; - NSString *message = [error localizedDescription]; - - if (error.code == FIRStorageErrorCodeUnknown) { - code = @"unknown"; - } else if (error.code == FIRStorageErrorCodeObjectNotFound) { - code = @"object-not-found"; - message = @"No object exists at the desired reference."; - } else if (error.code == FIRStorageErrorCodeBucketNotFound) { - code = @"bucket-not-found"; - message = @"No bucket is configured for Firebase Storage."; - } else if (error.code == FIRStorageErrorCodeProjectNotFound) { - code = @"project-not-found"; - message = @"No project is configured for Firebase Storage."; - } else if (error.code == FIRStorageErrorCodeQuotaExceeded) { - code = @"quota-exceeded"; - message = @"Quota on your Firebase Storage bucket has been exceeded."; - } else if (error.code == FIRStorageErrorCodeUnauthenticated) { - code = @"unauthenticated"; - message = @"User is unauthenticated. Authenticate and try again."; - } else if (error.code == FIRStorageErrorCodeUnauthorized) { - code = @"unauthorized"; - message = @"User is not authorized to perform the desired action."; - } else if (error.code == FIRStorageErrorCodeRetryLimitExceeded) { - code = @"retry-limit-exceeded"; - message = @"The maximum time limit on an operation (upload, download, delete, etc.) has been " - @"exceeded."; - } else if (error.code == FIRStorageErrorCodeNonMatchingChecksum) { - code = @"invalid-checksum"; - message = @"File on the client does not match the checksum of the file received by the server."; - } else if (error.code == FIRStorageErrorCodeDownloadSizeExceeded) { - code = @"download-size-exceeded"; - message = - @"Size of the downloaded file exceeds the amount of memory allocated for the download."; - } else if (error.code == FIRStorageErrorCodeCancelled) { - code = @"canceled"; - message = @"User cancelled the operation."; - } else if (error.code == FIRStorageErrorCodeInvalidArgument) { - code = @"invalid-argument"; - } - - dictionary[@"code"] = code; - dictionary[@"message"] = message; - - return dictionary; -} - -- (FlutterError *_Nullable)FlutterErrorFromNSError:(NSError *_Nullable)error { - if (error == nil) { - return nil; - } - NSDictionary *dictionary = [FLTFirebaseStoragePlugin NSDictionaryFromNSError:error]; - return [FlutterError errorWithCode:dictionary[@"code"] - message:dictionary[@"message"] - details:@{}]; -} - -- (NSDictionary *)NSDictionaryFromHandle:(NSNumber *)handle - andFIRStorageTaskSnapshot:(FIRStorageTaskSnapshot *)snapshot { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - dictionary[kFLTFirebaseStorageKeyHandle] = handle; - dictionary[kFLTFirebaseStorageKeyAppName] = - [FLTFirebasePlugin firebaseAppNameFromIosName:snapshot.reference.storage.app.name]; - dictionary[kFLTFirebaseStorageKeyBucket] = snapshot.reference.bucket; - if (snapshot.error != nil) { - dictionary[@"error"] = [FLTFirebaseStoragePlugin NSDictionaryFromNSError:snapshot.error]; - } else { - dictionary[kFLTFirebaseStorageKeySnapshot] = - [FLTFirebaseStoragePlugin parseTaskSnapshot:snapshot]; - } - return dictionary; -} - -+ (NSDictionary *)parseTaskSnapshot:(FIRStorageTaskSnapshot *)snapshot { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - - dictionary[kFLTFirebaseStorageKeyPath] = snapshot.reference.fullPath; - - if (snapshot.metadata != nil) { - dictionary[@"metadata"] = - [FLTFirebaseStoragePlugin NSDictionaryFromFIRStorageMetadata:snapshot.metadata]; - } - - if (snapshot.progress != nil) { - dictionary[@"bytesTransferred"] = @(snapshot.progress.completedUnitCount); - dictionary[@"totalBytes"] = @(snapshot.progress.totalUnitCount); - } else { - dictionary[@"bytesTransferred"] = @(0); - dictionary[@"totalBytes"] = @(0); - } - - return dictionary; -} - -- (NSData *)NSDataFromUploadString:(NSString *)string format:(FLTFirebaseStorageStringType)format { - // Dart: PutStringFormat.base64 - if (format == FLTFirebaseStorageStringTypeBase64) { - return [[NSData alloc] initWithBase64EncodedString:string options:0]; - } - - // Dart: PutStringFormat.base64Url - if (format == FLTFirebaseStorageStringTypeBase64URL) { - // Convert to base64 from base64url. - NSString *base64Encoded = string; - base64Encoded = [base64Encoded stringByReplacingOccurrencesOfString:@"-" withString:@"+"]; - base64Encoded = [base64Encoded stringByReplacingOccurrencesOfString:@"_" withString:@"/"]; - // Add mandatory base64 encoding padding. - while (base64Encoded.length % 4 != 0) { - base64Encoded = [base64Encoded stringByAppendingString:@"="]; - } - - return [[NSData alloc] initWithBase64EncodedString:base64Encoded options:0]; - } - - return nil; -} - -- (NSDictionary *)NSDictionaryFromFIRStorageListResult:(FIRStorageListResult *)listResult { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - - NSMutableArray *items = [[NSMutableArray alloc] init]; - for (FIRStorageReference *reference in listResult.items) { - [items addObject:reference.fullPath]; - } - dictionary[kFLTFirebaseStorageKeyItems] = items; - - NSMutableArray *prefixes = [[NSMutableArray alloc] init]; - for (FIRStorageReference *reference in listResult.prefixes) { - [prefixes addObject:reference.fullPath]; - } - dictionary[kFLTFirebaseStorageKeyPrefixes] = prefixes; - - if (listResult.pageToken != nil) { - dictionary[kFLTFirebaseStorageKeyNextPageToken] = listResult.pageToken; - } - - return dictionary; -} - -+ (NSDictionary *)NSDictionaryFromFIRStorageMetadata:(FIRStorageMetadata *)metadata { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - - [dictionary setValue:[metadata name] forKey:kFLTFirebaseStorageKeyName]; - [dictionary setValue:[metadata bucket] forKey:kFLTFirebaseStorageKeyBucket]; - - [dictionary setValue:[NSString stringWithFormat:@"%lld", [metadata generation]] - forKey:kFLTFirebaseStorageKeyGeneration]; - - [dictionary setValue:[NSString stringWithFormat:@"%lld", [metadata metageneration]] - forKey:kFLTFirebaseStorageKeyMetadataGeneration]; - - [dictionary setValue:[metadata path] forKey:kFLTFirebaseStorageKeyFullPath]; - - [dictionary setValue:@([metadata size]) forKey:kFLTFirebaseStorageKeySize]; - - [dictionary setValue:@((long)([[metadata timeCreated] timeIntervalSince1970] * 1000.0)) - forKey:kFLTFirebaseStorageKeyCreationTime]; - - [dictionary setValue:@((long)([[metadata updated] timeIntervalSince1970] * 1000.0)) - forKey:kFLTFirebaseStorageKeyUpdatedTime]; - - if ([metadata md5Hash] != nil) { - [dictionary setValue:[metadata md5Hash] forKey:kFLTFirebaseStorageKeyMD5Hash]; - } - - if ([metadata cacheControl] != nil) { - [dictionary setValue:[metadata cacheControl] forKey:kFLTFirebaseStorageKeyCacheControl]; - } - - if ([metadata contentDisposition] != nil) { - [dictionary setValue:[metadata contentDisposition] - forKey:kFLTFirebaseStorageKeyContentDisposition]; - } - - if ([metadata contentEncoding] != nil) { - [dictionary setValue:[metadata contentEncoding] forKey:kFLTFirebaseStorageKeyContentEncoding]; - } - - if ([metadata contentLanguage] != nil) { - [dictionary setValue:[metadata contentLanguage] forKey:kFLTFirebaseStorageKeyContentLanguage]; - } - - if ([metadata contentType] != nil) { - [dictionary setValue:[metadata contentType] forKey:kFLTFirebaseStorageKeyContentType]; - } - - if ([metadata customMetadata] != nil) { - [dictionary setValue:[metadata customMetadata] forKey:kFLTFirebaseStorageKeyCustomMetadata]; - } else { - [dictionary setValue:@{} forKey:kFLTFirebaseStorageKeyCustomMetadata]; - } - - return dictionary; -} - -#pragma mark - FLTFirebasePlugin - -- (void)didReinitializeFirebaseCore:(void (^)(void))completion { - [self cleanupWithCompletion:completion]; -} - -- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *)firebase_app { - return @{}; -} - -- (NSString *_Nonnull)firebaseLibraryName { - return @LIBRARY_NAME; -} - -- (NSString *_Nonnull)firebaseLibraryVersion { - return @LIBRARY_VERSION; -} - -- (NSString *_Nonnull)flutterChannelName { - return kFLTFirebaseStorageChannelName; -} - -@end diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift new file mode 100644 index 000000000000..2696d2c9f94d --- /dev/null +++ b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift @@ -0,0 +1,390 @@ +// Copyright 2025 The Chromium Authors. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import FirebaseStorage +import Foundation + +#if canImport(firebase_core) + import firebase_core +#else + import firebase_core_shared +#endif + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#endif + +extension FlutterError: Error {} + +public final class FLTFirebaseStoragePlugin: NSObject, FlutterPlugin, FirebaseStorageHostApi { + private var channel: FlutterMethodChannel? + private var messenger: FlutterBinaryMessenger? + private var eventChannels: [String: FlutterEventChannel] = [:] + private var streamHandlers: [String: FlutterStreamHandler] = [:] + private var handleToTask: [Int64: AnyObject] = [:] + private var handleToPath: [Int64: String] = [:] + private var handleToIdentifier: [Int64: String] = [:] + + // Registry to help stream handler classify failure events as cancellations when initiated from + // Dart + static var canceledIdentifiers = Set() + + @objc + public static func register(with registrar: FlutterPluginRegistrar) { + let channelName = "plugins.flutter.io/firebase_storage" + // Resolve platform-specific messenger API differences + #if os(iOS) + let resolvedMessenger: FlutterBinaryMessenger = registrar.messenger() + #else + let resolvedMessenger: FlutterBinaryMessenger = registrar.messenger + #endif + let channel = FlutterMethodChannel(name: channelName, binaryMessenger: resolvedMessenger) + let instance = FLTFirebaseStoragePlugin() + instance.channel = channel + instance.messenger = resolvedMessenger + registrar.addMethodCallDelegate(instance, channel: channel) + FirebaseStorageHostApiSetup.setUp(binaryMessenger: resolvedMessenger, api: instance) + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + result(FlutterMethodNotImplemented) + } + + private func storage(app: PigeonStorageFirebaseApp) -> Storage { + let base = "gs://" + app.bucket + let firApp = FLTFirebasePlugin.firebaseAppNamed(app.appName)! + return Storage.storage(app: firApp, url: base) + } + + private func ref(app: PigeonStorageFirebaseApp, + reference: PigeonStorageReference) -> StorageReference { + storage(app: app).reference(withPath: reference.fullPath) + } + + private func toPigeon(_ ref: StorageReference) -> PigeonStorageReference { + PigeonStorageReference(bucket: ref.bucket, fullPath: ref.fullPath, name: ref.name) + } + + func getReferencebyPath(app: PigeonStorageFirebaseApp, path: String, bucket: String?, + completion: @escaping (Result) -> Void) { + let r = storage(app: app).reference(withPath: path) + completion(.success(PigeonStorageReference( + bucket: r.bucket, + fullPath: r.fullPath, + name: r.name + ))) + } + + func setMaxOperationRetryTime(app: PigeonStorageFirebaseApp, time: Int64, + completion: @escaping (Result) -> Void) { + storage(app: app).maxOperationRetryTime = TimeInterval(Double(time) / 1000.0) + completion(.success(())) + } + + func setMaxUploadRetryTime(app: PigeonStorageFirebaseApp, time: Int64, + completion: @escaping (Result) -> Void) { + storage(app: app).maxUploadRetryTime = TimeInterval(Double(time) / 1000.0) + completion(.success(())) + } + + func setMaxDownloadRetryTime(app: PigeonStorageFirebaseApp, time: Int64, + completion: @escaping (Result) -> Void) { + storage(app: app).maxDownloadRetryTime = TimeInterval(Double(time) / 1000.0) + completion(.success(())) + } + + func useStorageEmulator(app: PigeonStorageFirebaseApp, host: String, port: Int64, + completion: @escaping (Result) -> Void) { + let s = storage(app: app) + s.useEmulator(withHost: host, port: Int(port)) + completion(.success(())) + } + + func referenceDelete(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + completion: @escaping (Result) -> Void) { + ref(app: app, reference: reference).delete { error in + if let e = error { completion(.failure(self.toFlutterError(e))) } + else { completion(.success(())) } + } + } + + func referenceGetDownloadURL(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + completion: @escaping (Result) -> Void) { + ref(app: app, reference: reference).downloadURL { url, error in + if let e = error { completion(.failure(self.toFlutterError(e))) } + else { completion(.success(url!.absoluteString.replacingOccurrences( + of: ":443", + with: "" + ))) } + } + } + + func referenceGetMetaData(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + completion: @escaping (Result) -> Void) { + ref(app: app, reference: reference).getMetadata { md, error in + if let e = error { completion(.failure(self.toFlutterError(e))) } else { + completion(.success(PigeonFullMetaData(metadata: self.metaToDict(md)))) + } + } + } + + func referenceList(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + options: PigeonListOptions, + completion: @escaping (Result) -> Void) { + let r = ref(app: app, reference: reference) + let block: (StorageListResult?, Error?) -> Void = { list, error in + if let e = error { completion(.failure(self.toFlutterError(e))) } else { + completion(.success(self.listToPigeon(list!))) + } + } + if let token = options.pageToken { + r.list(maxResults: options.maxResults, pageToken: token, completion: block) + } else { + r.list(maxResults: options.maxResults, completion: block) + } + } + + func referenceListAll(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + completion: @escaping (Result) -> Void) { + ref(app: app, reference: reference).listAll { list, error in + if let e = error { completion(.failure(self.toFlutterError(e))) } + else { completion(.success(self.listToPigeon(list!))) } + } + } + + func referenceGetData(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + maxSize: Int64, + completion: @escaping (Result) -> Void) { + ref(app: app, reference: reference).getData(maxSize: maxSize) { data, error in + if let e = error { + completion(.failure(self.toFlutterError(e))) + } else if let data { + completion(.success(FlutterStandardTypedData(bytes: data))) + } else { + completion(.success(nil)) + } + } + } + + func referencePutData(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + data: FlutterStandardTypedData, settableMetaData: PigeonSettableMetadata, + handle: Int64, completion: @escaping (Result) -> Void) { + let r = ref(app: app, reference: reference) + let task = r.putData(data.data, metadata: toMeta(settableMetaData)) + completion(.success(registerTask( + task: task, + appName: r.storage.app.name, + handle: handle, + path: r.fullPath + ))) + } + + func referencePutString(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + data: String, format: Int64, settableMetaData: PigeonSettableMetadata, + handle: Int64, completion: @escaping (Result) -> Void) { + let r = ref(app: app, reference: reference) + let d: Data + if format == 1 { d = Data(base64Encoded: data) ?? Data() } + else if format == + 2 { + d = Data(base64Encoded: data.replacingOccurrences(of: "-", with: "+") + .replacingOccurrences(of: "_", with: "/") + .padding(toLength: ((data.count + 3) / 4) * 4, withPad: "=", startingAt: 0)) ?? Data() + } else { d = Data() } + let task = r.putData(d, metadata: toMeta(settableMetaData)) + completion(.success(registerTask( + task: task, + appName: r.storage.app.name, + handle: handle, + path: r.fullPath + ))) + } + + func referencePutFile(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + filePath: String, settableMetaData: PigeonSettableMetadata?, handle: Int64, + completion: @escaping (Result) -> Void) { + let r = ref(app: app, reference: reference) + let url = URL(fileURLWithPath: filePath) + let task: StorageUploadTask + if let md = settableMetaData { task = r.putFile(from: url, metadata: toMeta(md)) } + else { task = r.putFile(from: url) } + completion(.success(registerTask( + task: task, + appName: r.storage.app.name, + handle: handle, + path: r.fullPath + ))) + } + + func referenceDownloadFile(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + filePath: String, handle: Int64, + completion: @escaping (Result) -> Void) { + let r = ref(app: app, reference: reference) + let url = URL(fileURLWithPath: filePath) + let task = r.write(toFile: url) + completion(.success(registerTask( + task: task, + appName: r.storage.app.name, + handle: handle, + path: r.fullPath + ))) + } + + func referenceUpdateMetadata(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + metadata: PigeonSettableMetadata, + completion: @escaping (Result) -> Void) { + ref(app: app, reference: reference).updateMetadata(toMeta(metadata)) { md, error in + if let e = error { completion(.failure(self.toFlutterError(e))) } + else { completion(.success(PigeonFullMetaData(metadata: self.metaToDict(md)))) } + } + } + + func taskPause(app: PigeonStorageFirebaseApp, handle: Int64, + completion: @escaping (Result<[String: Any], Error>) -> Void) { + if let task = handleToTask[handle] as? StorageUploadTask { + task.pause() + completion(.success(["status": true, "snapshot": currentSnapshot(handle: handle)])) + } else if let task = handleToTask[handle] as? StorageDownloadTask { + task.pause() + completion(.success(["status": true, "snapshot": currentSnapshot(handle: handle)])) + } else { + completion(.success(["status": false])) + } + } + + func taskResume(app: PigeonStorageFirebaseApp, handle: Int64, + completion: @escaping (Result<[String: Any], Error>) -> Void) { + if let task = handleToTask[handle] as? StorageUploadTask { + task.resume() + completion(.success(["status": true, "snapshot": currentSnapshot(handle: handle)])) + } else if let task = handleToTask[handle] as? StorageDownloadTask { + task.resume() + completion(.success(["status": true, "snapshot": currentSnapshot(handle: handle)])) + } else { + completion(.success(["status": false])) + } + } + + func taskCancel(app: PigeonStorageFirebaseApp, handle: Int64, + completion: @escaping (Result<[String: Any], Error>) -> Void) { + if let task = handleToTask[handle] as? StorageUploadTask { + task.cancel() + if let id = handleToIdentifier[handle] { + FLTFirebaseStoragePlugin.canceledIdentifiers.insert(id) + } + completion(.success(["status": true, "snapshot": currentSnapshot(handle: handle)])) + } else if let task = handleToTask[handle] as? StorageDownloadTask { + task.cancel() + if let id = handleToIdentifier[handle] { + FLTFirebaseStoragePlugin.canceledIdentifiers.insert(id) + } + completion(.success(["status": true, "snapshot": currentSnapshot(handle: handle)])) + } else { + completion(.success(["status": false])) + } + } + + private func toMeta(_ m: PigeonSettableMetadata) -> StorageMetadata { + let md = StorageMetadata() + if let v = m.cacheControl { md.cacheControl = v } + if let v = m.contentType { md.contentType = v } + if let v = m.contentDisposition { md.contentDisposition = v } + if let v = m.contentEncoding { md.contentEncoding = v } + if let v = m.contentLanguage { md.contentLanguage = v } + if let v = m.customMetadata { md.customMetadata = v as? [String: String] } + return md + } + + private func metaToDict(_ md: StorageMetadata?) -> [String: Any]? { + guard let md else { return nil } + var out: [String: Any] = [:] + out["name"] = md.name + out["bucket"] = md.bucket + out["generation"] = String(md.generation) + out["metadataGeneration"] = String(md.metageneration) + out["fullPath"] = md.path + out["size"] = md.size + out["creationTimeMillis"] = Int((md.timeCreated?.timeIntervalSince1970 ?? 0) * 1000) + out["updatedTimeMillis"] = Int((md.updated?.timeIntervalSince1970 ?? 0) * 1000) + if let v = md.md5Hash { out["md5Hash"] = v } + if let v = md.cacheControl { out["cacheControl"] = v } + if let v = md.contentDisposition { out["contentDisposition"] = v } + if let v = md.contentEncoding { out["contentEncoding"] = v } + if let v = md.contentLanguage { out["contentLanguage"] = v } + if let v = md.contentType { out["contentType"] = v } + out["customMetadata"] = md.customMetadata ?? [:] + return out + } + + private func listToPigeon(_ list: StorageListResult) -> PigeonListResult { + let items = list.items.map { toPigeon($0) } + let prefixes = list.prefixes.map { toPigeon($0) } + let itemsOpt: [PigeonStorageReference?] = items.map { Optional($0) } + let prefixesOpt: [PigeonStorageReference?] = prefixes.map { Optional($0) } + return PigeonListResult(items: itemsOpt, pageToken: list.pageToken, prefixs: prefixesOpt) + } + + private func registerTask(task: StorageObservableTask, appName: String, handle: Int64, + path: String) -> String { + let uuid = UUID().uuidString + let channelName = "plugins.flutter.io/firebase_storage/taskEvent/\(uuid)" + let channel = FlutterEventChannel(name: channelName, binaryMessenger: messenger!) + let storageInstance = Storage.storage(app: FLTFirebasePlugin.firebaseAppNamed(appName)!) + channel.setStreamHandler(TaskStateChannelStreamHandler( + task: task, + storage: storageInstance, + identifier: channelName + )) + eventChannels[channelName] = channel + handleToTask[handle] = task as AnyObject + handleToPath[handle] = path + handleToIdentifier[handle] = channelName + return uuid + } + + private func currentSnapshot(handle: Int64) -> [String: Any] { + [ + "path": handleToPath[handle] ?? "", + "bytesTransferred": 0, + "totalBytes": 0, + ] + } + + private func toFlutterError(_ error: Error) -> Error { + let ns = error as NSError + let code = mapStorageErrorCode(ns) + let message = standardMessage(for: code) ?? ns.localizedDescription + return FlutterError(code: code, message: message, details: [:]) + } + + private func mapStorageErrorCode(_ error: NSError) -> String { + if error.domain == StorageErrorDomain, let code = StorageErrorCode(rawValue: error.code) { + switch code { + case .objectNotFound: return "object-not-found" + case .bucketNotFound: return "bucket-not-found" + case .projectNotFound: return "project-not-found" + case .quotaExceeded: return "quota-exceeded" + case .unauthenticated: return "unauthenticated" + case .unauthorized: return "unauthorized" + case .retryLimitExceeded: return "retry-limit-exceeded" + case .cancelled: return "canceled" + case .downloadSizeExceeded: return "download-size-exceeded" + @unknown default: return "unknown" + } + } else if error.domain == NSURLErrorDomain, error.code == NSURLErrorCancelled { + return "canceled" + } + return "unknown" + } + + private func standardMessage(for code: String) -> String? { + switch code { + case "object-not-found": return "No object exists at the desired reference." + case "unauthorized": return "User is not authorized to perform the desired action." + default: return nil + } + } +} diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTTaskStateChannelStreamHandler.m b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTTaskStateChannelStreamHandler.m deleted file mode 100644 index 348c275ab527..000000000000 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTTaskStateChannelStreamHandler.m +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2023 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -@import FirebaseStorage; - -#import "FLTTaskStateChannelStreamHandler.h" -#import "FLTFirebaseStoragePlugin.h" - -@implementation FLTTaskStateChannelStreamHandler { - FIRStorageObservableTask *_task; - FLTFirebaseStoragePlugin *_storagePlugin; - NSString *_channelName; - NSNumber *_handle; - NSString *successHandle; - NSString *failureHandle; - NSString *pausedHandle; - NSString *progressHandle; -} - -- (instancetype)initWithTask:(FIRStorageObservableTask *)task - storagePlugin:(FLTFirebaseStoragePlugin *)storagePlugin - channelName:(NSString *)channelName - handle:(NSNumber *)handle { - self = [super init]; - if (self) { - _task = task; - _storagePlugin = storagePlugin; - _channelName = channelName; - _handle = handle; - } - return self; -} - -- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { - // Set up the various status listeners - successHandle = - [_task observeStatus:FIRStorageTaskStatusSuccess - handler:^(FIRStorageTaskSnapshot *snapshot) { - events(@{ - @"taskState" : @(PigeonStorageTaskStateSuccess), - @"appName" : snapshot.reference.storage.app.name, - @"snapshot" : [FLTFirebaseStoragePlugin parseTaskSnapshot:snapshot], - }); - }]; - failureHandle = - [_task observeStatus:FIRStorageTaskStatusFailure - handler:^(FIRStorageTaskSnapshot *snapshot) { - NSError *error = snapshot.error; - // If the snapshot.error is "unknown" and there is an underlying error, use - // this. For UploadTasks, the correct error is in the underlying error. - if (snapshot.error.code == FIRStorageErrorCodeUnknown && - snapshot.error.userInfo[@"NSUnderlyingError"] != nil) { - error = snapshot.error.userInfo[@"NSUnderlyingError"]; - } - events(@{ - @"taskState" : @(PigeonStorageTaskStateError), - @"appName" : snapshot.reference.storage.app.name, - @"error" : [FLTFirebaseStoragePlugin NSDictionaryFromNSError:error], - }); - }]; - pausedHandle = - [_task observeStatus:FIRStorageTaskStatusPause - handler:^(FIRStorageTaskSnapshot *snapshot) { - events(@{ - @"taskState" : @(PigeonStorageTaskStatePaused), - @"appName" : snapshot.reference.storage.app.name, - @"snapshot" : [FLTFirebaseStoragePlugin parseTaskSnapshot:snapshot], - }); - }]; - progressHandle = - [_task observeStatus:FIRStorageTaskStatusProgress - handler:^(FIRStorageTaskSnapshot *snapshot) { - events(@{ - @"taskState" : @(PigeonStorageTaskStateRunning), - @"appName" : snapshot.reference.storage.app.name, - @"snapshot" : [FLTFirebaseStoragePlugin parseTaskSnapshot:snapshot], - }); - }]; - - return nil; -} - -- (FlutterError *)onCancelWithArguments:(id)arguments { - if (!_task) { - return nil; - } - - if (successHandle) { - [_task removeObserverWithHandle:successHandle]; - } - successHandle = nil; - - if (failureHandle) { - [_task removeObserverWithHandle:failureHandle]; - } - failureHandle = nil; - - if (pausedHandle) { - [_task removeObserverWithHandle:pausedHandle]; - } - pausedHandle = nil; - - if (progressHandle) { - [_task removeObserverWithHandle:progressHandle]; - } - progressHandle = nil; - - if (_storagePlugin) { - [_storagePlugin cleanUpTask:_channelName handle:_handle]; - } - - return nil; -} - -@end diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift new file mode 100644 index 000000000000..35094d379e30 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift @@ -0,0 +1,823 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v11.0.1), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +import Foundation +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#else + #error("Unsupported platform.") +#endif + +private func isNullish(_ value: Any?) -> Bool { + value is NSNull || value == nil +} + +private func wrapResult(_ result: Any?) -> [Any?] { + [result] +} + +private func wrapError(_ error: Any) -> [Any?] { + if let flutterError = error as? FlutterError { + return [ + flutterError.code, + flutterError.message, + flutterError.details, + ] + } + return [ + "\(error)", + "\(type(of: error))", + "Stacktrace: \(Thread.callStackSymbols)", + ] +} + +private func nilOrValue(_ value: Any?) -> T? { + if value is NSNull { return nil } + return value as! T? +} + +/// The type of operation that generated the action code from calling +/// [TaskState]. +enum PigeonStorageTaskState: Int { + /// Indicates the task has been paused by the user. + case paused = 0 + /// Indicates the task is currently in-progress. + case running = 1 + /// Indicates the task has successfully completed. + case success = 2 + /// Indicates the task was canceled. + case canceled = 3 + /// Indicates the task failed with an error. + case error = 4 +} + +/// Generated class from Pigeon that represents data sent in messages. +struct PigeonStorageFirebaseApp { + var appName: String + var tenantId: String? + var bucket: String + + static func fromList(_ list: [Any?]) -> PigeonStorageFirebaseApp? { + let appName = list[0] as! String + let tenantId: String? = nilOrValue(list[1]) + let bucket = list[2] as! String + + return PigeonStorageFirebaseApp( + appName: appName, + tenantId: tenantId, + bucket: bucket + ) + } + + func toList() -> [Any?] { + [ + appName, + tenantId, + bucket, + ] + } +} + +/// Generated class from Pigeon that represents data sent in messages. +struct PigeonStorageReference { + var bucket: String + var fullPath: String + var name: String + + static func fromList(_ list: [Any?]) -> PigeonStorageReference? { + let bucket = list[0] as! String + let fullPath = list[1] as! String + let name = list[2] as! String + + return PigeonStorageReference( + bucket: bucket, + fullPath: fullPath, + name: name + ) + } + + func toList() -> [Any?] { + [ + bucket, + fullPath, + name, + ] + } +} + +/// Generated class from Pigeon that represents data sent in messages. +struct PigeonFullMetaData { + var metadata: [String?: Any?]? + + static func fromList(_ list: [Any?]) -> PigeonFullMetaData? { + let metadata: [String?: Any?]? = nilOrValue(list[0]) + + return PigeonFullMetaData( + metadata: metadata + ) + } + + func toList() -> [Any?] { + [ + metadata, + ] + } +} + +/// Generated class from Pigeon that represents data sent in messages. +struct PigeonListOptions { + /// If set, limits the total number of `prefixes` and `items` to return. + /// + /// The default and maximum maxResults is 1000. + var maxResults: Int64 + /// The nextPageToken from a previous call to list(). + /// + /// If provided, listing is resumed from the previous position. + var pageToken: String? + + static func fromList(_ list: [Any?]) -> PigeonListOptions? { + let maxResults = list[0] is Int64 ? list[0] as! Int64 : Int64(list[0] as! Int32) + let pageToken: String? = nilOrValue(list[1]) + + return PigeonListOptions( + maxResults: maxResults, + pageToken: pageToken + ) + } + + func toList() -> [Any?] { + [ + maxResults, + pageToken, + ] + } +} + +/// Generated class from Pigeon that represents data sent in messages. +struct PigeonSettableMetadata { + /// Served as the 'Cache-Control' header on object download. + /// + /// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control. + var cacheControl: String? + /// Served as the 'Content-Disposition' header on object download. + /// + /// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition. + var contentDisposition: String? + /// Served as the 'Content-Encoding' header on object download. + /// + /// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding. + var contentEncoding: String? + /// Served as the 'Content-Language' header on object download. + /// + /// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language. + var contentLanguage: String? + /// Served as the 'Content-Type' header on object download. + /// + /// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type. + var contentType: String? + /// Additional user-defined custom metadata. + var customMetadata: [String?: String?]? + + static func fromList(_ list: [Any?]) -> PigeonSettableMetadata? { + let cacheControl: String? = nilOrValue(list[0]) + let contentDisposition: String? = nilOrValue(list[1]) + let contentEncoding: String? = nilOrValue(list[2]) + let contentLanguage: String? = nilOrValue(list[3]) + let contentType: String? = nilOrValue(list[4]) + let customMetadata: [String?: String?]? = nilOrValue(list[5]) + + return PigeonSettableMetadata( + cacheControl: cacheControl, + contentDisposition: contentDisposition, + contentEncoding: contentEncoding, + contentLanguage: contentLanguage, + contentType: contentType, + customMetadata: customMetadata + ) + } + + func toList() -> [Any?] { + [ + cacheControl, + contentDisposition, + contentEncoding, + contentLanguage, + contentType, + customMetadata, + ] + } +} + +/// Generated class from Pigeon that represents data sent in messages. +struct PigeonListResult { + var items: [PigeonStorageReference?] + var pageToken: String? + var prefixs: [PigeonStorageReference?] + + static func fromList(_ list: [Any?]) -> PigeonListResult? { + let items = list[0] as! [PigeonStorageReference?] + let pageToken: String? = nilOrValue(list[1]) + let prefixs = list[2] as! [PigeonStorageReference?] + + return PigeonListResult( + items: items, + pageToken: pageToken, + prefixs: prefixs + ) + } + + func toList() -> [Any?] { + [ + items, + pageToken, + prefixs, + ] + } +} + +private class FirebaseStorageHostApiCodecReader: FlutterStandardReader { + override func readValue(ofType type: UInt8) -> Any? { + switch type { + case 128: + return PigeonFullMetaData.fromList(readValue() as! [Any?]) + case 129: + return PigeonListOptions.fromList(readValue() as! [Any?]) + case 130: + return PigeonListResult.fromList(readValue() as! [Any?]) + case 131: + return PigeonSettableMetadata.fromList(readValue() as! [Any?]) + case 132: + return PigeonStorageFirebaseApp.fromList(readValue() as! [Any?]) + case 133: + return PigeonStorageReference.fromList(readValue() as! [Any?]) + default: + return super.readValue(ofType: type) + } + } +} + +private class FirebaseStorageHostApiCodecWriter: FlutterStandardWriter { + override func writeValue(_ value: Any) { + if let value = value as? PigeonFullMetaData { + super.writeByte(128) + super.writeValue(value.toList()) + } else if let value = value as? PigeonListOptions { + super.writeByte(129) + super.writeValue(value.toList()) + } else if let value = value as? PigeonListResult { + super.writeByte(130) + super.writeValue(value.toList()) + } else if let value = value as? PigeonSettableMetadata { + super.writeByte(131) + super.writeValue(value.toList()) + } else if let value = value as? PigeonStorageFirebaseApp { + super.writeByte(132) + super.writeValue(value.toList()) + } else if let value = value as? PigeonStorageReference { + super.writeByte(133) + super.writeValue(value.toList()) + } else { + super.writeValue(value) + } + } +} + +private class FirebaseStorageHostApiCodecReaderWriter: FlutterStandardReaderWriter { + override func reader(with data: Data) -> FlutterStandardReader { + FirebaseStorageHostApiCodecReader(data: data) + } + + override func writer(with data: NSMutableData) -> FlutterStandardWriter { + FirebaseStorageHostApiCodecWriter(data: data) + } +} + +class FirebaseStorageHostApiCodec: FlutterStandardMessageCodec { + static let shared = + FirebaseStorageHostApiCodec(readerWriter: FirebaseStorageHostApiCodecReaderWriter()) +} + +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol FirebaseStorageHostApi { + func getReferencebyPath(app: PigeonStorageFirebaseApp, path: String, bucket: String?, + completion: @escaping (Result) -> Void) + func setMaxOperationRetryTime(app: PigeonStorageFirebaseApp, time: Int64, + completion: @escaping (Result) -> Void) + func setMaxUploadRetryTime(app: PigeonStorageFirebaseApp, time: Int64, + completion: @escaping (Result) -> Void) + func setMaxDownloadRetryTime(app: PigeonStorageFirebaseApp, time: Int64, + completion: @escaping (Result) -> Void) + func useStorageEmulator(app: PigeonStorageFirebaseApp, host: String, port: Int64, + completion: @escaping (Result) -> Void) + func referenceDelete(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + completion: @escaping (Result) -> Void) + func referenceGetDownloadURL(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + completion: @escaping (Result) -> Void) + func referenceGetMetaData(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + completion: @escaping (Result) -> Void) + func referenceList(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + options: PigeonListOptions, + completion: @escaping (Result) -> Void) + func referenceListAll(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + completion: @escaping (Result) -> Void) + func referenceGetData(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + maxSize: Int64, + completion: @escaping (Result) -> Void) + func referencePutData(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + data: FlutterStandardTypedData, settableMetaData: PigeonSettableMetadata, + handle: Int64, completion: @escaping (Result) -> Void) + func referencePutString(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + data: String, format: Int64, settableMetaData: PigeonSettableMetadata, + handle: Int64, completion: @escaping (Result) -> Void) + func referencePutFile(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + filePath: String, settableMetaData: PigeonSettableMetadata?, handle: Int64, + completion: @escaping (Result) -> Void) + func referenceDownloadFile(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + filePath: String, handle: Int64, + completion: @escaping (Result) -> Void) + func referenceUpdateMetadata(app: PigeonStorageFirebaseApp, reference: PigeonStorageReference, + metadata: PigeonSettableMetadata, + completion: @escaping (Result) -> Void) + func taskPause(app: PigeonStorageFirebaseApp, handle: Int64, + completion: @escaping (Result<[String: Any], Error>) -> Void) + func taskResume(app: PigeonStorageFirebaseApp, handle: Int64, + completion: @escaping (Result<[String: Any], Error>) -> Void) + func taskCancel(app: PigeonStorageFirebaseApp, handle: Int64, + completion: @escaping (Result<[String: Any], Error>) -> Void) +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +class FirebaseStorageHostApiSetup { + /// The codec used by FirebaseStorageHostApi. + static var codec: FlutterStandardMessageCodec { FirebaseStorageHostApiCodec.shared } + /// Sets up an instance of `FirebaseStorageHostApi` to handle messages through the + /// `binaryMessenger`. + static func setUp(binaryMessenger: FlutterBinaryMessenger, api: FirebaseStorageHostApi?) { + let getReferencebyPathChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.getReferencebyPath", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + getReferencebyPathChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let pathArg = args[1] as! String + let bucketArg: String? = nilOrValue(args[2]) + api.getReferencebyPath(app: appArg, path: pathArg, bucket: bucketArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + getReferencebyPathChannel.setMessageHandler(nil) + } + let setMaxOperationRetryTimeChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxOperationRetryTime", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + setMaxOperationRetryTimeChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let timeArg = args[1] is Int64 ? args[1] as! Int64 : Int64(args[1] as! Int32) + api.setMaxOperationRetryTime(app: appArg, time: timeArg) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + setMaxOperationRetryTimeChannel.setMessageHandler(nil) + } + let setMaxUploadRetryTimeChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxUploadRetryTime", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + setMaxUploadRetryTimeChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let timeArg = args[1] is Int64 ? args[1] as! Int64 : Int64(args[1] as! Int32) + api.setMaxUploadRetryTime(app: appArg, time: timeArg) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + setMaxUploadRetryTimeChannel.setMessageHandler(nil) + } + let setMaxDownloadRetryTimeChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.setMaxDownloadRetryTime", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + setMaxDownloadRetryTimeChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let timeArg = args[1] is Int64 ? args[1] as! Int64 : Int64(args[1] as! Int32) + api.setMaxDownloadRetryTime(app: appArg, time: timeArg) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + setMaxDownloadRetryTimeChannel.setMessageHandler(nil) + } + let useStorageEmulatorChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.useStorageEmulator", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + useStorageEmulatorChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let hostArg = args[1] as! String + let portArg = args[2] is Int64 ? args[2] as! Int64 : Int64(args[2] as! Int32) + api.useStorageEmulator(app: appArg, host: hostArg, port: portArg) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + useStorageEmulatorChannel.setMessageHandler(nil) + } + let referenceDeleteChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDelete", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referenceDeleteChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + api.referenceDelete(app: appArg, reference: referenceArg) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referenceDeleteChannel.setMessageHandler(nil) + } + let referenceGetDownloadURLChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetDownloadURL", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referenceGetDownloadURLChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + api.referenceGetDownloadURL(app: appArg, reference: referenceArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referenceGetDownloadURLChannel.setMessageHandler(nil) + } + let referenceGetMetaDataChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetMetaData", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referenceGetMetaDataChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + api.referenceGetMetaData(app: appArg, reference: referenceArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referenceGetMetaDataChannel.setMessageHandler(nil) + } + let referenceListChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceList", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referenceListChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + let optionsArg = args[2] as! PigeonListOptions + api.referenceList(app: appArg, reference: referenceArg, options: optionsArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referenceListChannel.setMessageHandler(nil) + } + let referenceListAllChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceListAll", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referenceListAllChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + api.referenceListAll(app: appArg, reference: referenceArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referenceListAllChannel.setMessageHandler(nil) + } + let referenceGetDataChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceGetData", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referenceGetDataChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + let maxSizeArg = args[2] is Int64 ? args[2] as! Int64 : Int64(args[2] as! Int32) + api.referenceGetData(app: appArg, reference: referenceArg, maxSize: maxSizeArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referenceGetDataChannel.setMessageHandler(nil) + } + let referencePutDataChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutData", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referencePutDataChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + let dataArg = args[2] as! FlutterStandardTypedData + let settableMetaDataArg = args[3] as! PigeonSettableMetadata + let handleArg = args[4] is Int64 ? args[4] as! Int64 : Int64(args[4] as! Int32) + api.referencePutData( + app: appArg, + reference: referenceArg, + data: dataArg, + settableMetaData: settableMetaDataArg, + handle: handleArg + ) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referencePutDataChannel.setMessageHandler(nil) + } + let referencePutStringChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutString", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referencePutStringChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + let dataArg = args[2] as! String + let formatArg = args[3] is Int64 ? args[3] as! Int64 : Int64(args[3] as! Int32) + let settableMetaDataArg = args[4] as! PigeonSettableMetadata + let handleArg = args[5] is Int64 ? args[5] as! Int64 : Int64(args[5] as! Int32) + api.referencePutString( + app: appArg, + reference: referenceArg, + data: dataArg, + format: formatArg, + settableMetaData: settableMetaDataArg, + handle: handleArg + ) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referencePutStringChannel.setMessageHandler(nil) + } + let referencePutFileChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referencePutFileChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + let filePathArg = args[2] as! String + let settableMetaDataArg: PigeonSettableMetadata? = nilOrValue(args[3]) + let handleArg = args[4] is Int64 ? args[4] as! Int64 : Int64(args[4] as! Int32) + api.referencePutFile( + app: appArg, + reference: referenceArg, + filePath: filePathArg, + settableMetaData: settableMetaDataArg, + handle: handleArg + ) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referencePutFileChannel.setMessageHandler(nil) + } + let referenceDownloadFileChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceDownloadFile", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referenceDownloadFileChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + let filePathArg = args[2] as! String + let handleArg = args[3] is Int64 ? args[3] as! Int64 : Int64(args[3] as! Int32) + api.referenceDownloadFile( + app: appArg, + reference: referenceArg, + filePath: filePathArg, + handle: handleArg + ) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referenceDownloadFileChannel.setMessageHandler(nil) + } + let referenceUpdateMetadataChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referenceUpdateMetadata", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + referenceUpdateMetadataChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let referenceArg = args[1] as! PigeonStorageReference + let metadataArg = args[2] as! PigeonSettableMetadata + api + .referenceUpdateMetadata(app: appArg, reference: referenceArg, + metadata: metadataArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + referenceUpdateMetadataChannel.setMessageHandler(nil) + } + let taskPauseChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskPause", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + taskPauseChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let handleArg = args[1] is Int64 ? args[1] as! Int64 : Int64(args[1] as! Int32) + api.taskPause(app: appArg, handle: handleArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + taskPauseChannel.setMessageHandler(nil) + } + let taskResumeChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskResume", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + taskResumeChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let handleArg = args[1] is Int64 ? args[1] as! Int64 : Int64(args[1] as! Int32) + api.taskResume(app: appArg, handle: handleArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + taskResumeChannel.setMessageHandler(nil) + } + let taskCancelChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.taskCancel", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { + taskCancelChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appArg = args[0] as! PigeonStorageFirebaseApp + let handleArg = args[1] is Int64 ? args[1] as! Int64 : Int64(args[1] as! Int32) + api.taskCancel(app: appArg, handle: handleArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } + } + } + } else { + taskCancelChannel.setMessageHandler(nil) + } + } +} diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/TaskStateChannelStreamHandler.swift b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/TaskStateChannelStreamHandler.swift new file mode 100644 index 000000000000..9cc69b046a25 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/TaskStateChannelStreamHandler.swift @@ -0,0 +1,160 @@ +// Copyright 2025 The Chromium Authors. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import FirebaseStorage +import Foundation + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#endif + +final class TaskStateChannelStreamHandler: NSObject, FlutterStreamHandler { + private let task: StorageObservableTask + private let storage: Storage + private let identifier: String + + private var successHandle: String? + private var failureHandle: String? + private var pausedHandle: String? + private var progressHandle: String? + + init(task: StorageObservableTask, storage: Storage, identifier: String) { + self.task = task + self.storage = storage + self.identifier = identifier + } + + func onListen(withArguments arguments: Any?, + eventSink events: @escaping FlutterEventSink) -> FlutterError? { + successHandle = task.observe(.success) { snapshot in + events([ + "taskState": 2, // success + "appName": self.storage.app.name, + "snapshot": self.parseTaskSnapshot(snapshot), + ]) + self.cleanupObservers() + } + failureHandle = task.observe(.failure) { snapshot in + let err = snapshot.error as NSError? + let errorDict: [String: Any] = self.errorDict(err) + events([ + "taskState": 4, // error (including cancellations as errors per platform contract) + "appName": self.storage.app.name, + "error": errorDict, + ]) + self.cleanupObservers() + } + pausedHandle = task.observe(.pause) { snapshot in + events([ + "taskState": 0, // paused + "appName": self.storage.app.name, + "snapshot": self.parseTaskSnapshot(snapshot), + ]) + } + progressHandle = task.observe(.progress) { snapshot in + events([ + "taskState": 1, // running + "appName": self.storage.app.name, + "snapshot": self.parseTaskSnapshot(snapshot), + ]) + } + return nil + } + + func onCancel(withArguments arguments: Any?) -> FlutterError? { + cleanupObservers() + return nil + } + + private func cleanupObservers() { + if let h = successHandle { task.removeObserver(withHandle: h) } + if let h = failureHandle { task.removeObserver(withHandle: h) } + if let h = pausedHandle { task.removeObserver(withHandle: h) } + if let h = progressHandle { task.removeObserver(withHandle: h) } + successHandle = nil + failureHandle = nil + pausedHandle = nil + progressHandle = nil + } + + private func parseTaskSnapshot(_ snapshot: StorageTaskSnapshot) -> [String: Any] { + var out: [String: Any] = [:] + out["path"] = snapshot.reference.fullPath + if let md = snapshot.metadata { + out["metadata"] = metaToDict(md) + } + if let progress = snapshot.progress { + out["bytesTransferred"] = progress.completedUnitCount + out["totalBytes"] = progress.totalUnitCount + } else { + out["bytesTransferred"] = 0 + out["totalBytes"] = 0 + } + return out + } + + private func errorDict(_ error: NSError?) -> [String: Any] { + guard let error else { + return [ + "code": "unknown", + "message": "An unknown error occurred", + ] + } + let code: String + if error.domain == StorageErrorDomain, + let storageCode = StorageErrorCode(rawValue: error.code) { + switch storageCode { + case .objectNotFound: code = "object-not-found" + case .bucketNotFound: code = "bucket-not-found" + case .projectNotFound: code = "project-not-found" + case .quotaExceeded: code = "quota-exceeded" + case .unauthenticated: code = "unauthenticated" + case .unauthorized: code = "unauthorized" + case .retryLimitExceeded: code = "retry-limit-exceeded" + case .cancelled: code = "canceled" + case .downloadSizeExceeded: code = "download-size-exceeded" + @unknown default: code = "unknown" + } + } else if error.domain == NSURLErrorDomain, error.code == NSURLErrorCancelled { + code = "canceled" + } else { + code = "unknown" + } + return [ + "code": code, + "message": standardMessage(for: code) ?? error.localizedDescription, + ] + } + + private func standardMessage(for code: String) -> String? { + switch code { + case "object-not-found": return "No object exists at the desired reference." + case "unauthorized": return "User is not authorized to perform the desired action." + case "canceled": return "The operation was canceled." + default: return nil + } + } + + private func metaToDict(_ md: StorageMetadata) -> [String: Any] { + var out: [String: Any] = [:] + out["name"] = md.name + out["bucket"] = md.bucket + out["generation"] = String(md.generation) + out["metadataGeneration"] = String(md.metageneration) + out["fullPath"] = md.path + out["size"] = md.size + out["creationTimeMillis"] = Int((md.timeCreated?.timeIntervalSince1970 ?? 0) * 1000) + out["updatedTimeMillis"] = Int((md.updated?.timeIntervalSince1970 ?? 0) * 1000) + if let v = md.md5Hash { out["md5Hash"] = v } + if let v = md.cacheControl { out["cacheControl"] = v } + if let v = md.contentDisposition { out["contentDisposition"] = v } + if let v = md.contentEncoding { out["contentEncoding"] = v } + if let v = md.contentLanguage { out["contentLanguage"] = v } + if let v = md.contentType { out["contentType"] = v } + out["customMetadata"] = md.customMetadata ?? [:] + return out + } +} diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m deleted file mode 100644 index 975e4e0a7406..000000000000 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m +++ /dev/null @@ -1,866 +0,0 @@ -// Copyright 2023, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// Autogenerated from Pigeon (v11.0.1), do not edit directly. -// See also: https://pub.dev/packages/pigeon - -#import "firebase_storage_messages.g.h" - -#if TARGET_OS_OSX -#import -#else -#import -#endif - -#if !__has_feature(objc_arc) -#error File requires ARC to be enabled. -#endif - -/// The type of operation that generated the action code from calling -/// [TaskState]. -@implementation PigeonStorageTaskStateBox -- (instancetype)initWithValue:(PigeonStorageTaskState)value { - self = [super init]; - if (self) { - _value = value; - } - return self; -} -@end - -static NSArray *wrapResult(id result, FlutterError *error) { - if (error) { - return @[ - error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] - ]; - } - return @[ result ?: [NSNull null] ]; -} -static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { - id result = array[key]; - return (result == [NSNull null]) ? nil : result; -} - -@interface PigeonStorageFirebaseApp () -+ (PigeonStorageFirebaseApp *)fromList:(NSArray *)list; -+ (nullable PigeonStorageFirebaseApp *)nullableFromList:(NSArray *)list; -- (NSArray *)toList; -@end - -@interface PigeonStorageReference () -+ (PigeonStorageReference *)fromList:(NSArray *)list; -+ (nullable PigeonStorageReference *)nullableFromList:(NSArray *)list; -- (NSArray *)toList; -@end - -@interface PigeonFullMetaData () -+ (PigeonFullMetaData *)fromList:(NSArray *)list; -+ (nullable PigeonFullMetaData *)nullableFromList:(NSArray *)list; -- (NSArray *)toList; -@end - -@interface PigeonListOptions () -+ (PigeonListOptions *)fromList:(NSArray *)list; -+ (nullable PigeonListOptions *)nullableFromList:(NSArray *)list; -- (NSArray *)toList; -@end - -@interface PigeonSettableMetadata () -+ (PigeonSettableMetadata *)fromList:(NSArray *)list; -+ (nullable PigeonSettableMetadata *)nullableFromList:(NSArray *)list; -- (NSArray *)toList; -@end - -@interface PigeonListResult () -+ (PigeonListResult *)fromList:(NSArray *)list; -+ (nullable PigeonListResult *)nullableFromList:(NSArray *)list; -- (NSArray *)toList; -@end - -@implementation PigeonStorageFirebaseApp -+ (instancetype)makeWithAppName:(NSString *)appName - tenantId:(nullable NSString *)tenantId - bucket:(NSString *)bucket { - PigeonStorageFirebaseApp *pigeonResult = [[PigeonStorageFirebaseApp alloc] init]; - pigeonResult.appName = appName; - pigeonResult.tenantId = tenantId; - pigeonResult.bucket = bucket; - return pigeonResult; -} -+ (PigeonStorageFirebaseApp *)fromList:(NSArray *)list { - PigeonStorageFirebaseApp *pigeonResult = [[PigeonStorageFirebaseApp alloc] init]; - pigeonResult.appName = GetNullableObjectAtIndex(list, 0); - NSAssert(pigeonResult.appName != nil, @""); - pigeonResult.tenantId = GetNullableObjectAtIndex(list, 1); - pigeonResult.bucket = GetNullableObjectAtIndex(list, 2); - NSAssert(pigeonResult.bucket != nil, @""); - return pigeonResult; -} -+ (nullable PigeonStorageFirebaseApp *)nullableFromList:(NSArray *)list { - return (list) ? [PigeonStorageFirebaseApp fromList:list] : nil; -} -- (NSArray *)toList { - return @[ - (self.appName ?: [NSNull null]), - (self.tenantId ?: [NSNull null]), - (self.bucket ?: [NSNull null]), - ]; -} -@end - -@implementation PigeonStorageReference -+ (instancetype)makeWithBucket:(NSString *)bucket - fullPath:(NSString *)fullPath - name:(NSString *)name { - PigeonStorageReference *pigeonResult = [[PigeonStorageReference alloc] init]; - pigeonResult.bucket = bucket; - pigeonResult.fullPath = fullPath; - pigeonResult.name = name; - return pigeonResult; -} -+ (PigeonStorageReference *)fromList:(NSArray *)list { - PigeonStorageReference *pigeonResult = [[PigeonStorageReference alloc] init]; - pigeonResult.bucket = GetNullableObjectAtIndex(list, 0); - NSAssert(pigeonResult.bucket != nil, @""); - pigeonResult.fullPath = GetNullableObjectAtIndex(list, 1); - NSAssert(pigeonResult.fullPath != nil, @""); - pigeonResult.name = GetNullableObjectAtIndex(list, 2); - NSAssert(pigeonResult.name != nil, @""); - return pigeonResult; -} -+ (nullable PigeonStorageReference *)nullableFromList:(NSArray *)list { - return (list) ? [PigeonStorageReference fromList:list] : nil; -} -- (NSArray *)toList { - return @[ - (self.bucket ?: [NSNull null]), - (self.fullPath ?: [NSNull null]), - (self.name ?: [NSNull null]), - ]; -} -@end - -@implementation PigeonFullMetaData -+ (instancetype)makeWithMetadata:(nullable NSDictionary *)metadata { - PigeonFullMetaData *pigeonResult = [[PigeonFullMetaData alloc] init]; - pigeonResult.metadata = metadata; - return pigeonResult; -} -+ (PigeonFullMetaData *)fromList:(NSArray *)list { - PigeonFullMetaData *pigeonResult = [[PigeonFullMetaData alloc] init]; - pigeonResult.metadata = GetNullableObjectAtIndex(list, 0); - return pigeonResult; -} -+ (nullable PigeonFullMetaData *)nullableFromList:(NSArray *)list { - return (list) ? [PigeonFullMetaData fromList:list] : nil; -} -- (NSArray *)toList { - return @[ - (self.metadata ?: [NSNull null]), - ]; -} -@end - -@implementation PigeonListOptions -+ (instancetype)makeWithMaxResults:(NSNumber *)maxResults pageToken:(nullable NSString *)pageToken { - PigeonListOptions *pigeonResult = [[PigeonListOptions alloc] init]; - pigeonResult.maxResults = maxResults; - pigeonResult.pageToken = pageToken; - return pigeonResult; -} -+ (PigeonListOptions *)fromList:(NSArray *)list { - PigeonListOptions *pigeonResult = [[PigeonListOptions alloc] init]; - pigeonResult.maxResults = GetNullableObjectAtIndex(list, 0); - NSAssert(pigeonResult.maxResults != nil, @""); - pigeonResult.pageToken = GetNullableObjectAtIndex(list, 1); - return pigeonResult; -} -+ (nullable PigeonListOptions *)nullableFromList:(NSArray *)list { - return (list) ? [PigeonListOptions fromList:list] : nil; -} -- (NSArray *)toList { - return @[ - (self.maxResults ?: [NSNull null]), - (self.pageToken ?: [NSNull null]), - ]; -} -@end - -@implementation PigeonSettableMetadata -+ (instancetype)makeWithCacheControl:(nullable NSString *)cacheControl - contentDisposition:(nullable NSString *)contentDisposition - contentEncoding:(nullable NSString *)contentEncoding - contentLanguage:(nullable NSString *)contentLanguage - contentType:(nullable NSString *)contentType - customMetadata: - (nullable NSDictionary *)customMetadata { - PigeonSettableMetadata *pigeonResult = [[PigeonSettableMetadata alloc] init]; - pigeonResult.cacheControl = cacheControl; - pigeonResult.contentDisposition = contentDisposition; - pigeonResult.contentEncoding = contentEncoding; - pigeonResult.contentLanguage = contentLanguage; - pigeonResult.contentType = contentType; - pigeonResult.customMetadata = customMetadata; - return pigeonResult; -} -+ (PigeonSettableMetadata *)fromList:(NSArray *)list { - PigeonSettableMetadata *pigeonResult = [[PigeonSettableMetadata alloc] init]; - pigeonResult.cacheControl = GetNullableObjectAtIndex(list, 0); - pigeonResult.contentDisposition = GetNullableObjectAtIndex(list, 1); - pigeonResult.contentEncoding = GetNullableObjectAtIndex(list, 2); - pigeonResult.contentLanguage = GetNullableObjectAtIndex(list, 3); - pigeonResult.contentType = GetNullableObjectAtIndex(list, 4); - pigeonResult.customMetadata = GetNullableObjectAtIndex(list, 5); - return pigeonResult; -} -+ (nullable PigeonSettableMetadata *)nullableFromList:(NSArray *)list { - return (list) ? [PigeonSettableMetadata fromList:list] : nil; -} -- (NSArray *)toList { - return @[ - (self.cacheControl ?: [NSNull null]), - (self.contentDisposition ?: [NSNull null]), - (self.contentEncoding ?: [NSNull null]), - (self.contentLanguage ?: [NSNull null]), - (self.contentType ?: [NSNull null]), - (self.customMetadata ?: [NSNull null]), - ]; -} -@end - -@implementation PigeonListResult -+ (instancetype)makeWithItems:(NSArray *)items - pageToken:(nullable NSString *)pageToken - prefixs:(NSArray *)prefixs { - PigeonListResult *pigeonResult = [[PigeonListResult alloc] init]; - pigeonResult.items = items; - pigeonResult.pageToken = pageToken; - pigeonResult.prefixs = prefixs; - return pigeonResult; -} -+ (PigeonListResult *)fromList:(NSArray *)list { - PigeonListResult *pigeonResult = [[PigeonListResult alloc] init]; - pigeonResult.items = GetNullableObjectAtIndex(list, 0); - NSAssert(pigeonResult.items != nil, @""); - pigeonResult.pageToken = GetNullableObjectAtIndex(list, 1); - pigeonResult.prefixs = GetNullableObjectAtIndex(list, 2); - NSAssert(pigeonResult.prefixs != nil, @""); - return pigeonResult; -} -+ (nullable PigeonListResult *)nullableFromList:(NSArray *)list { - return (list) ? [PigeonListResult fromList:list] : nil; -} -- (NSArray *)toList { - return @[ - (self.items ?: [NSNull null]), - (self.pageToken ?: [NSNull null]), - (self.prefixs ?: [NSNull null]), - ]; -} -@end - -@interface FirebaseStorageHostApiCodecReader : FlutterStandardReader -@end -@implementation FirebaseStorageHostApiCodecReader -- (nullable id)readValueOfType:(UInt8)type { - switch (type) { - case 128: - return [PigeonFullMetaData fromList:[self readValue]]; - case 129: - return [PigeonListOptions fromList:[self readValue]]; - case 130: - return [PigeonListResult fromList:[self readValue]]; - case 131: - return [PigeonSettableMetadata fromList:[self readValue]]; - case 132: - return [PigeonStorageFirebaseApp fromList:[self readValue]]; - case 133: - return [PigeonStorageReference fromList:[self readValue]]; - default: - return [super readValueOfType:type]; - } -} -@end - -@interface FirebaseStorageHostApiCodecWriter : FlutterStandardWriter -@end -@implementation FirebaseStorageHostApiCodecWriter -- (void)writeValue:(id)value { - if ([value isKindOfClass:[PigeonFullMetaData class]]) { - [self writeByte:128]; - [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[PigeonListOptions class]]) { - [self writeByte:129]; - [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[PigeonListResult class]]) { - [self writeByte:130]; - [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[PigeonSettableMetadata class]]) { - [self writeByte:131]; - [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[PigeonStorageFirebaseApp class]]) { - [self writeByte:132]; - [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[PigeonStorageReference class]]) { - [self writeByte:133]; - [self writeValue:[value toList]]; - } else { - [super writeValue:value]; - } -} -@end - -@interface FirebaseStorageHostApiCodecReaderWriter : FlutterStandardReaderWriter -@end -@implementation FirebaseStorageHostApiCodecReaderWriter -- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { - return [[FirebaseStorageHostApiCodecWriter alloc] initWithData:data]; -} -- (FlutterStandardReader *)readerWithData:(NSData *)data { - return [[FirebaseStorageHostApiCodecReader alloc] initWithData:data]; -} -@end - -NSObject *FirebaseStorageHostApiGetCodec(void) { - static FlutterStandardMessageCodec *sSharedObject = nil; - static dispatch_once_t sPred = 0; - dispatch_once(&sPred, ^{ - FirebaseStorageHostApiCodecReaderWriter *readerWriter = - [[FirebaseStorageHostApiCodecReaderWriter alloc] init]; - sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; - }); - return sSharedObject; -} - -void FirebaseStorageHostApiSetup(id binaryMessenger, - NSObject *api) { - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.getReferencebyPath" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(getReferencebyPathApp:path:bucket:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(getReferencebyPathApp:path:bucket:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - NSString *arg_path = GetNullableObjectAtIndex(args, 1); - NSString *arg_bucket = GetNullableObjectAtIndex(args, 2); - [api getReferencebyPathApp:arg_app - path:arg_path - bucket:arg_bucket - completion:^(PigeonStorageReference *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.setMaxOperationRetryTime" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(setMaxOperationRetryTimeApp:time:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(setMaxOperationRetryTimeApp:time:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - NSNumber *arg_time = GetNullableObjectAtIndex(args, 1); - [api setMaxOperationRetryTimeApp:arg_app - time:arg_time - completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.setMaxUploadRetryTime" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(setMaxUploadRetryTimeApp:time:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(setMaxUploadRetryTimeApp:time:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - NSNumber *arg_time = GetNullableObjectAtIndex(args, 1); - [api setMaxUploadRetryTimeApp:arg_app - time:arg_time - completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.setMaxDownloadRetryTime" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(setMaxDownloadRetryTimeApp:time:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(setMaxDownloadRetryTimeApp:time:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - NSNumber *arg_time = GetNullableObjectAtIndex(args, 1); - [api setMaxDownloadRetryTimeApp:arg_app - time:arg_time - completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.useStorageEmulator" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(useStorageEmulatorApp:host:port:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(useStorageEmulatorApp:host:port:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - NSString *arg_host = GetNullableObjectAtIndex(args, 1); - NSNumber *arg_port = GetNullableObjectAtIndex(args, 2); - [api useStorageEmulatorApp:arg_app - host:arg_host - port:arg_port - completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referenceDelete" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(referenceDeleteApp:reference:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referenceDeleteApp:reference:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - [api referenceDeleteApp:arg_app - reference:arg_reference - completion:^(FlutterError *_Nullable error) { - callback(wrapResult(nil, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referenceGetDownloadURL" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(referenceGetDownloadURLApp: - reference:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referenceGetDownloadURLApp:reference:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - [api referenceGetDownloadURLApp:arg_app - reference:arg_reference - completion:^(NSString *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referenceGetMetaData" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(referenceGetMetaDataApp:reference:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referenceGetMetaDataApp:reference:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - [api referenceGetMetaDataApp:arg_app - reference:arg_reference - completion:^(PigeonFullMetaData *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referenceList" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(referenceListApp:reference:options:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referenceListApp:reference:options:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - PigeonListOptions *arg_options = GetNullableObjectAtIndex(args, 2); - [api referenceListApp:arg_app - reference:arg_reference - options:arg_options - completion:^(PigeonListResult *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referenceListAll" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(referenceListAllApp:reference:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referenceListAllApp:reference:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - [api referenceListAllApp:arg_app - reference:arg_reference - completion:^(PigeonListResult *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referenceGetData" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(referenceGetDataApp: - reference:maxSize:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referenceGetDataApp:reference:maxSize:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - NSNumber *arg_maxSize = GetNullableObjectAtIndex(args, 2); - [api referenceGetDataApp:arg_app - reference:arg_reference - maxSize:arg_maxSize - completion:^(FlutterStandardTypedData *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referencePutData" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert( - [api respondsToSelector:@selector - (referencePutDataApp:reference:data:settableMetaData:handle:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referencePutDataApp:reference:data:settableMetaData:handle:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - FlutterStandardTypedData *arg_data = GetNullableObjectAtIndex(args, 2); - PigeonSettableMetadata *arg_settableMetaData = GetNullableObjectAtIndex(args, 3); - NSNumber *arg_handle = GetNullableObjectAtIndex(args, 4); - [api referencePutDataApp:arg_app - reference:arg_reference - data:arg_data - settableMetaData:arg_settableMetaData - handle:arg_handle - completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referencePutString" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector - (referencePutStringApp: - reference:data:format:settableMetaData:handle:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referencePutStringApp:reference:data:format:settableMetaData:handle:" - @"completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - NSString *arg_data = GetNullableObjectAtIndex(args, 2); - NSNumber *arg_format = GetNullableObjectAtIndex(args, 3); - PigeonSettableMetadata *arg_settableMetaData = GetNullableObjectAtIndex(args, 4); - NSNumber *arg_handle = GetNullableObjectAtIndex(args, 5); - [api referencePutStringApp:arg_app - reference:arg_reference - data:arg_data - format:arg_format - settableMetaData:arg_settableMetaData - handle:arg_handle - completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referencePutFile" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert( - [api respondsToSelector:@selector - (referencePutFileApp:reference:filePath:settableMetaData:handle:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referencePutFileApp:reference:filePath:settableMetaData:handle:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - NSString *arg_filePath = GetNullableObjectAtIndex(args, 2); - PigeonSettableMetadata *arg_settableMetaData = GetNullableObjectAtIndex(args, 3); - NSNumber *arg_handle = GetNullableObjectAtIndex(args, 4); - [api referencePutFileApp:arg_app - reference:arg_reference - filePath:arg_filePath - settableMetaData:arg_settableMetaData - handle:arg_handle - completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referenceDownloadFile" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector - (referenceDownloadFileApp:reference:filePath:handle:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referenceDownloadFileApp:reference:filePath:handle:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - NSString *arg_filePath = GetNullableObjectAtIndex(args, 2); - NSNumber *arg_handle = GetNullableObjectAtIndex(args, 3); - [api referenceDownloadFileApp:arg_app - reference:arg_reference - filePath:arg_filePath - handle:arg_handle - completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.referenceUpdateMetadata" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(referenceUpdateMetadataApp: - reference:metadata:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(referenceUpdateMetadataApp:reference:metadata:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - PigeonStorageReference *arg_reference = GetNullableObjectAtIndex(args, 1); - PigeonSettableMetadata *arg_metadata = GetNullableObjectAtIndex(args, 2); - [api referenceUpdateMetadataApp:arg_app - reference:arg_reference - metadata:arg_metadata - completion:^(PigeonFullMetaData *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.taskPause" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(taskPauseApp:handle:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(taskPauseApp:handle:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - NSNumber *arg_handle = GetNullableObjectAtIndex(args, 1); - [api taskPauseApp:arg_app - handle:arg_handle - completion:^(NSDictionary *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.taskResume" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(taskResumeApp:handle:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(taskResumeApp:handle:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - NSNumber *arg_handle = GetNullableObjectAtIndex(args, 1); - [api taskResumeApp:arg_app - handle:arg_handle - completion:^(NSDictionary *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.firebase_storage_platform_interface." - @"FirebaseStorageHostApi.taskCancel" - binaryMessenger:binaryMessenger - codec:FirebaseStorageHostApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(taskCancelApp:handle:completion:)], - @"FirebaseStorageHostApi api (%@) doesn't respond to " - @"@selector(taskCancelApp:handle:completion:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - PigeonStorageFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); - NSNumber *arg_handle = GetNullableObjectAtIndex(args, 1); - [api taskCancelApp:arg_app - handle:arg_handle - completion:^(NSDictionary *_Nullable output, - FlutterError *_Nullable error) { - callback(wrapResult(output, error)); - }]; - }]; - } else { - [channel setMessageHandler:nil]; - } - } -} diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/FLTFirebaseStoragePlugin.h b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/FLTFirebaseStoragePlugin.h deleted file mode 100644 index b1d616329395..000000000000 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/FLTFirebaseStoragePlugin.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -#import - -#if TARGET_OS_OSX -// Forward declarations of Firebase Storage type -@class FIRStorageTaskSnapshot; -#import -#else -#import -@import FirebaseStorage; -#endif - -#import -#if __has_include() -#import -#else -#import -#endif -#import "firebase_storage_messages.g.h" - -@interface FLTFirebaseStoragePlugin - : FLTFirebasePlugin - -+ (NSDictionary *)parseTaskSnapshot:(FIRStorageTaskSnapshot *)snapshot; -+ (NSDictionary *)NSDictionaryFromNSError:(NSError *)error; -- (void)cleanUpTask:(NSString *)channelName handle:(NSNumber *)handle; -@end diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/FLTTaskStateChannelStreamHandler.h b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/FLTTaskStateChannelStreamHandler.h deleted file mode 100644 index 681a0964d024..000000000000 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/FLTTaskStateChannelStreamHandler.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2023 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -#if TARGET_OS_OSX -// Forward declarations of Firebase Storage type -@class FIRStorageObservableTask; -#import -#else -#import -@import FirebaseStorage; -#endif - -#import -#import "FLTFirebaseStoragePlugin.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface FLTTaskStateChannelStreamHandler : NSObject -- (instancetype)initWithTask:(FIRStorageObservableTask *)task - storagePlugin:(FLTFirebaseStoragePlugin *)storagePlugin - channelName:(NSString *)channelName - handle:(NSNumber *)handle; - -@end - -NS_ASSUME_NONNULL_END diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h deleted file mode 100644 index 451ee2320ce8..000000000000 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2023, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// Autogenerated from Pigeon (v11.0.1), do not edit directly. -// See also: https://pub.dev/packages/pigeon - -#import - -@protocol FlutterBinaryMessenger; -@protocol FlutterMessageCodec; -@class FlutterError; -@class FlutterStandardTypedData; - -NS_ASSUME_NONNULL_BEGIN - -/// The type of operation that generated the action code from calling -/// [TaskState]. -typedef NS_ENUM(NSUInteger, PigeonStorageTaskState) { - /// Indicates the task has been paused by the user. - PigeonStorageTaskStatePaused = 0, - /// Indicates the task is currently in-progress. - PigeonStorageTaskStateRunning = 1, - /// Indicates the task has successfully completed. - PigeonStorageTaskStateSuccess = 2, - /// Indicates the task was canceled. - PigeonStorageTaskStateCanceled = 3, - /// Indicates the task failed with an error. - PigeonStorageTaskStateError = 4, -}; - -/// Wrapper for PigeonStorageTaskState to allow for nullability. -@interface PigeonStorageTaskStateBox : NSObject -@property(nonatomic, assign) PigeonStorageTaskState value; -- (instancetype)initWithValue:(PigeonStorageTaskState)value; -@end - -@class PigeonStorageFirebaseApp; -@class PigeonStorageReference; -@class PigeonFullMetaData; -@class PigeonListOptions; -@class PigeonSettableMetadata; -@class PigeonListResult; - -@interface PigeonStorageFirebaseApp : NSObject -/// `init` unavailable to enforce nonnull fields, see the `make` class method. -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithAppName:(NSString *)appName - tenantId:(nullable NSString *)tenantId - bucket:(NSString *)bucket; -@property(nonatomic, copy) NSString *appName; -@property(nonatomic, copy, nullable) NSString *tenantId; -@property(nonatomic, copy) NSString *bucket; -@end - -@interface PigeonStorageReference : NSObject -/// `init` unavailable to enforce nonnull fields, see the `make` class method. -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithBucket:(NSString *)bucket - fullPath:(NSString *)fullPath - name:(NSString *)name; -@property(nonatomic, copy) NSString *bucket; -@property(nonatomic, copy) NSString *fullPath; -@property(nonatomic, copy) NSString *name; -@end - -@interface PigeonFullMetaData : NSObject -+ (instancetype)makeWithMetadata:(nullable NSDictionary *)metadata; -@property(nonatomic, strong, nullable) NSDictionary *metadata; -@end - -@interface PigeonListOptions : NSObject -/// `init` unavailable to enforce nonnull fields, see the `make` class method. -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithMaxResults:(NSNumber *)maxResults pageToken:(nullable NSString *)pageToken; -/// If set, limits the total number of `prefixes` and `items` to return. -/// -/// The default and maximum maxResults is 1000. -@property(nonatomic, strong) NSNumber *maxResults; -/// The nextPageToken from a previous call to list(). -/// -/// If provided, listing is resumed from the previous position. -@property(nonatomic, copy, nullable) NSString *pageToken; -@end - -@interface PigeonSettableMetadata : NSObject -+ (instancetype)makeWithCacheControl:(nullable NSString *)cacheControl - contentDisposition:(nullable NSString *)contentDisposition - contentEncoding:(nullable NSString *)contentEncoding - contentLanguage:(nullable NSString *)contentLanguage - contentType:(nullable NSString *)contentType - customMetadata: - (nullable NSDictionary *)customMetadata; -/// Served as the 'Cache-Control' header on object download. -/// -/// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control. -@property(nonatomic, copy, nullable) NSString *cacheControl; -/// Served as the 'Content-Disposition' header on object download. -/// -/// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition. -@property(nonatomic, copy, nullable) NSString *contentDisposition; -/// Served as the 'Content-Encoding' header on object download. -/// -/// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding. -@property(nonatomic, copy, nullable) NSString *contentEncoding; -/// Served as the 'Content-Language' header on object download. -/// -/// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language. -@property(nonatomic, copy, nullable) NSString *contentLanguage; -/// Served as the 'Content-Type' header on object download. -/// -/// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type. -@property(nonatomic, copy, nullable) NSString *contentType; -/// Additional user-defined custom metadata. -@property(nonatomic, strong, nullable) NSDictionary *customMetadata; -@end - -@interface PigeonListResult : NSObject -/// `init` unavailable to enforce nonnull fields, see the `make` class method. -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithItems:(NSArray *)items - pageToken:(nullable NSString *)pageToken - prefixs:(NSArray *)prefixs; -@property(nonatomic, strong) NSArray *items; -@property(nonatomic, copy, nullable) NSString *pageToken; -@property(nonatomic, strong) NSArray *prefixs; -@end - -/// The codec used by FirebaseStorageHostApi. -NSObject *FirebaseStorageHostApiGetCodec(void); - -@protocol FirebaseStorageHostApi -- (void)getReferencebyPathApp:(PigeonStorageFirebaseApp *)app - path:(NSString *)path - bucket:(nullable NSString *)bucket - completion:(void (^)(PigeonStorageReference *_Nullable, - FlutterError *_Nullable))completion; -- (void)setMaxOperationRetryTimeApp:(PigeonStorageFirebaseApp *)app - time:(NSNumber *)time - completion:(void (^)(FlutterError *_Nullable))completion; -- (void)setMaxUploadRetryTimeApp:(PigeonStorageFirebaseApp *)app - time:(NSNumber *)time - completion:(void (^)(FlutterError *_Nullable))completion; -- (void)setMaxDownloadRetryTimeApp:(PigeonStorageFirebaseApp *)app - time:(NSNumber *)time - completion:(void (^)(FlutterError *_Nullable))completion; -- (void)useStorageEmulatorApp:(PigeonStorageFirebaseApp *)app - host:(NSString *)host - port:(NSNumber *)port - completion:(void (^)(FlutterError *_Nullable))completion; -- (void)referenceDeleteApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - completion:(void (^)(FlutterError *_Nullable))completion; -- (void)referenceGetDownloadURLApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - completion: - (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; -- (void)referenceGetMetaDataApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - completion:(void (^)(PigeonFullMetaData *_Nullable, - FlutterError *_Nullable))completion; -- (void)referenceListApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - options:(PigeonListOptions *)options - completion:(void (^)(PigeonListResult *_Nullable, FlutterError *_Nullable))completion; -- (void)referenceListAllApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - completion: - (void (^)(PigeonListResult *_Nullable, FlutterError *_Nullable))completion; -- (void)referenceGetDataApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - maxSize:(NSNumber *)maxSize - completion:(void (^)(FlutterStandardTypedData *_Nullable, - FlutterError *_Nullable))completion; -- (void)referencePutDataApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - data:(FlutterStandardTypedData *)data - settableMetaData:(PigeonSettableMetadata *)settableMetaData - handle:(NSNumber *)handle - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; -- (void)referencePutStringApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - data:(NSString *)data - format:(NSNumber *)format - settableMetaData:(PigeonSettableMetadata *)settableMetaData - handle:(NSNumber *)handle - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; -- (void)referencePutFileApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - filePath:(NSString *)filePath - settableMetaData:(nullable PigeonSettableMetadata *)settableMetaData - handle:(NSNumber *)handle - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; -- (void)referenceDownloadFileApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - filePath:(NSString *)filePath - handle:(NSNumber *)handle - completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; -- (void)referenceUpdateMetadataApp:(PigeonStorageFirebaseApp *)app - reference:(PigeonStorageReference *)reference - metadata:(PigeonSettableMetadata *)metadata - completion:(void (^)(PigeonFullMetaData *_Nullable, - FlutterError *_Nullable))completion; -- (void)taskPauseApp:(PigeonStorageFirebaseApp *)app - handle:(NSNumber *)handle - completion:(void (^)(NSDictionary *_Nullable, - FlutterError *_Nullable))completion; -- (void)taskResumeApp:(PigeonStorageFirebaseApp *)app - handle:(NSNumber *)handle - completion:(void (^)(NSDictionary *_Nullable, - FlutterError *_Nullable))completion; -- (void)taskCancelApp:(PigeonStorageFirebaseApp *)app - handle:(NSNumber *)handle - completion:(void (^)(NSDictionary *_Nullable, - FlutterError *_Nullable))completion; -@end - -extern void FirebaseStorageHostApiSetup(id binaryMessenger, - NSObject *_Nullable api); - -NS_ASSUME_NONNULL_END diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage.podspec b/packages/firebase_storage/firebase_storage/macos/firebase_storage.podspec index 744336dfc472..12c7a116a466 100755 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage.podspec +++ b/packages/firebase_storage/firebase_storage/macos/firebase_storage.podspec @@ -43,7 +43,7 @@ Pod::Spec.new do |s| s.authors = 'The Chromium Authors' s.source = { :path => '.' } - s.source_files = 'firebase_storage/Sources/firebase_storage/**/*.{h,m}' + s.source_files = 'firebase_storage/Sources/firebase_storage/**/*.{h,m,swift}' s.public_header_files = 'firebase_storage/Sources/firebase_storage/include/*.h' s.platform = :osx, '10.13' diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.m b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.m deleted file mode 120000 index 0d2def8bce9f..000000000000 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.m +++ /dev/null @@ -1 +0,0 @@ -../../../../ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.m \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift new file mode 120000 index 000000000000..0a96b2bbf102 --- /dev/null +++ b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift @@ -0,0 +1 @@ +../../../../ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTTaskStateChannelStreamHandler.m b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTTaskStateChannelStreamHandler.m deleted file mode 120000 index fdc4ba297cbf..000000000000 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FLTTaskStateChannelStreamHandler.m +++ /dev/null @@ -1 +0,0 @@ -../../../../ios/firebase_storage/Sources/firebase_storage/FLTTaskStateChannelStreamHandler.m \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift new file mode 120000 index 000000000000..2c852fb2483b --- /dev/null +++ b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift @@ -0,0 +1 @@ +../../../../ios/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/TaskStateChannelStreamHandler.swift b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/TaskStateChannelStreamHandler.swift new file mode 120000 index 000000000000..1f9775ba395f --- /dev/null +++ b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/TaskStateChannelStreamHandler.swift @@ -0,0 +1 @@ +../../../../ios/firebase_storage/Sources/firebase_storage/TaskStateChannelStreamHandler.swift \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m deleted file mode 120000 index 7db69a629c20..000000000000 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m +++ /dev/null @@ -1 +0,0 @@ -../../../../ios/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/FLTFirebaseStoragePlugin.h b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/FLTFirebaseStoragePlugin.h deleted file mode 120000 index fd17c9a3165c..000000000000 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/FLTFirebaseStoragePlugin.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../ios/firebase_storage/Sources/firebase_storage/include/FLTFirebaseStoragePlugin.h \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/FLTTaskStateChannelStreamHandler.h b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/FLTTaskStateChannelStreamHandler.h deleted file mode 120000 index 897446c7f13d..000000000000 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/FLTTaskStateChannelStreamHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../ios/firebase_storage/Sources/firebase_storage/include/FLTTaskStateChannelStreamHandler.h \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h deleted file mode 120000 index 7d19b22c7a47..000000000000 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../ios/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage/windows/messages.g.cpp b/packages/firebase_storage/firebase_storage/windows/messages.g.cpp index a77d577dc345..c4f093b94f48 100644 --- a/packages/firebase_storage/firebase_storage/windows/messages.g.cpp +++ b/packages/firebase_storage/firebase_storage/windows/messages.g.cpp @@ -1550,4 +1550,4 @@ EncodableValue FirebaseStorageHostApi::WrapError(const FlutterError& error) { error.details()}); } -} // namespace firebase_storage_windows +} // namespace firebase_storage_windows \ No newline at end of file diff --git a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart index 441ad5f1b400..cb10a718cc6b 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart @@ -38,7 +38,13 @@ abstract class MethodChannelTask extends TaskPlatform { if (taskState == TaskState.error) { _didComplete = true; final errorMap = Map.from(events['error']); - final code = errorMap['code']; + String code = errorMap['code']; + + // If native surfaced an unknown error but we already transitioned the + // task snapshot to canceled (due to a local cancel), surface as canceled. + if (code != 'canceled' && snapshot.state == TaskState.canceled) { + code = 'canceled'; + } final exception = FirebaseException( plugin: 'firebase_storage', diff --git a/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart b/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart index a46b624dc4a6..bd36f3a6b57d 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart @@ -11,16 +11,13 @@ import 'package:pigeon/pigeon.dart'; dartOut: 'lib/src/pigeon/messages.pigeon.dart', // We export in the lib folder to expose the class to other packages. dartTestOut: 'test/pigeon/test_api.dart', - javaOut: - '../firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java', - javaOptions: JavaOptions( + kotlinOut: + '../firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.g.kt', + kotlinOptions: KotlinOptions( package: 'io.flutter.plugins.firebase.storage', - className: 'GeneratedAndroidFirebaseStorage', ), - objcHeaderOut: - '../firebase_storage/ios/firebase_storage/Sources/firebase_storage/include/firebase_storage_messages.g.h', - objcSourceOut: - '../firebase_storage/ios/firebase_storage/Sources/firebase_storage/firebase_storage_messages.g.m', + swiftOut: + '../firebase_storage/ios/firebase_storage/Sources/firebase_storage/FirebaseStorageMessages.g.swift', cppHeaderOut: '../firebase_storage/windows/messages.g.h', cppSourceOut: '../firebase_storage/windows/messages.g.cpp', cppOptions: CppOptions(namespace: 'firebase_storage_windows'), diff --git a/tests/android/app/build.gradle b/tests/android/app/build.gradle index 454ebf1be987..b26d90633bf5 100644 --- a/tests/android/app/build.gradle +++ b/tests/android/app/build.gradle @@ -25,7 +25,7 @@ if (flutterVersionName == null) { android { namespace = "io.flutter.plugins.firebase.tests" - compileSdk = 35 + compileSdk = 36 ndkVersion = flutter.ndkVersion compileOptions { @@ -41,7 +41,7 @@ android { defaultConfig { applicationId = "io.flutter.plugins.firebase.tests" // auth requires minSdk 23 - minSdk = 23 + minSdkVersion flutter.minSdkVersion targetSdk = 35 versionCode = flutterVersionCode.toInteger() versionName = flutterVersionName diff --git a/tests/ios/Flutter/AppFrameworkInfo.plist b/tests/ios/Flutter/AppFrameworkInfo.plist index 7c5696400627..1dc6cf7652ba 100644 --- a/tests/ios/Flutter/AppFrameworkInfo.plist +++ b/tests/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 13.0 From 608f4312493d92b9eb51dedef53b1229e8052ab6 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Tue, 4 Nov 2025 15:59:15 +0000 Subject: [PATCH 07/17] fix(storage): merge refactor --- .../storage/FlutterFirebaseStoragePlugin.kt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.kt b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.kt index 7453d5040713..8f4b1e7fcee9 100644 --- a/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.kt +++ b/packages/firebase_storage/firebase_storage/android/src/main/kotlin/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.kt @@ -22,7 +22,6 @@ import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel.StreamHandler import io.flutter.plugin.common.MethodChannel import io.flutter.plugins.firebase.core.FlutterFirebasePlugin -import io.flutter.plugins.firebase.core.FlutterFirebasePlugin.cachedThreadPool import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry import java.io.File import java.util.Locale @@ -443,18 +442,18 @@ class FlutterFirebaseStoragePlugin : FlutterFirebasePlugin, FlutterPlugin, Fireb callback(Result.success(Unit)) } - override fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp?): Task> { - val taskCompletionSource = TaskCompletionSource>() - cachedThreadPool.execute { + override fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp): Task> { + val taskCompletionSource = TaskCompletionSource>() + FlutterFirebasePlugin.cachedThreadPool.execute { val obj = HashMap() taskCompletionSource.setResult(obj) } return taskCompletionSource.task } - override fun didReinitializeFirebaseCore(): Task { - val taskCompletionSource = TaskCompletionSource() - cachedThreadPool.execute { + override fun didReinitializeFirebaseCore(): Task { + val taskCompletionSource = TaskCompletionSource() + FlutterFirebasePlugin.cachedThreadPool.execute { FlutterFirebaseStorageTask.cancelInProgressTasks() taskCompletionSource.setResult(null) removeEventListeners() From d714085f3188034bb9d417c8595a63d92edf3a89 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Wed, 5 Nov 2025 08:33:33 +0000 Subject: [PATCH 08/17] fix: api signatures on other packages to adopt new core refactor --- .../FLTDocumentSnapshotStreamHandler.m | 2 +- .../FLTFirebaseFirestorePlugin.m | 2 +- .../FLTFirebaseFirestoreReader.m | 8 +-- .../FLTLoadBundleStreamHandler.m | 2 +- .../FLTQuerySnapshotStreamHandler.m | 2 +- .../Public/FLTFirebaseFirestorePlugin.h | 8 +-- .../FirebaseFunctionsPlugin.swift | 6 +- .../macos/cloud_functions.podspec | 1 - .../FirebaseAnalyticsPlugin.swift | 2 +- .../macos/firebase_analytics.podspec | 1 - .../FLTFirebaseAppCheckPlugin.m | 19 +++--- .../include/FLTFirebaseAppCheckPlugin.h | 8 +-- .../FirebaseInstallationsPlugin.swift | 22 +++---- .../firebase_auth/FLTFirebaseAuthPlugin.m | 19 ++---- .../include/Public/FLTFirebaseAuthPlugin.h | 8 +-- .../FLTFirebaseCrashlyticsPlugin.m | 15 ++--- .../include/FLTFirebaseCrashlyticsPlugin.h | 9 +-- .../FLTFirebaseDatabaseObserveStreamHandler.m | 15 ++--- .../FLTFirebaseDatabasePlugin.m | 22 ++++--- .../FLTFirebaseDatabaseUtils.m | 9 +-- .../include/FLTFirebaseDatabasePlugin.h | 8 +-- .../include/FirebaseInAppMessagingPlugin.h | 9 +-- .../FLTFirebaseMessagingPlugin.m | 60 +++++++++---------- .../include/FLTFirebaseMessagingPlugin.h | 14 ++--- .../FirebaseModelDownloaderPlugin.swift | 16 ++--- .../ios/firebase_performance/Package.swift | 5 -- .../FirebasePerformancePlugin.swift | 2 +- .../FirebaseRemoteConfigPlugin.swift | 4 +- .../ios/firebase_storage.podspec | 3 +- .../ios/firebase_storage/Package.swift | 5 -- .../FLTFirebaseStoragePlugin.swift | 4 +- .../macos/firebase_storage.podspec | 3 +- .../macos/firebase_storage/Package.swift | 5 -- 33 files changed, 116 insertions(+), 202 deletions(-) diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m index a787f8ad92b9..dd9a399e62d8 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m @@ -48,7 +48,7 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments @"message" : message, }; dispatch_async(dispatch_get_main_queue(), ^{ - events([FLTFirebasePlugin createFlutterErrorFromCode:code + events([FLTFirebasePluginHelper createFlutterErrorWithCode:code message:message optionalDetails:details andOptionalNSError:error]); diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m index b7fa740fe68c..115c878bfb46 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m @@ -220,7 +220,7 @@ - (FIRFirestore *_Nullable)getFIRFirestoreFromAppNameFromPigeon: NSString *appNameDart = pigeonApp.appName; NSString *databaseUrl = pigeonApp.databaseURL; - FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:appNameDart]; + FIRApp *app = [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:appNameDart]]; if ([FLTFirebaseFirestoreUtils getFirestoreInstanceByName:app.name databaseURL:databaseUrl] != nil) { diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreReader.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreReader.m index edfa4cba17ae..f0d4b38e8a0d 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreReader.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreReader.m @@ -4,12 +4,8 @@ @import FirebaseFirestore; @import FirebaseCore; +@import firebase_core; -#if __has_include() -#import -#else -#import -#endif #import "include/cloud_firestore/Private/FLTFirebaseFirestoreReader.h" #import "include/cloud_firestore/Private/FLTFirebaseFirestoreUtils.h" @@ -297,7 +293,7 @@ - (FIRFirestore *)FIRFirestore { NSString *appNameDart = [self readValue]; NSString *databaseUrl = [self readValue]; FIRFirestoreSettings *settings = [self readValue]; - FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:appNameDart]; + FIRApp *app = [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:appNameDart]]; if ([FLTFirebaseFirestoreUtils getFirestoreInstanceByName:app.name databaseURL:databaseUrl] != nil) { diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m index cc8bd9be9ae2..ad13d445790e 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m @@ -52,7 +52,7 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments }; dispatch_async(dispatch_get_main_queue(), ^{ - events([FLTFirebasePlugin createFlutterErrorFromCode:code + events([FLTFirebasePluginHelper createFlutterErrorWithCode:code message:message optionalDetails:details andOptionalNSError:error]); diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m index bb80a2d6e69e..70469601fd3e 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m @@ -58,7 +58,7 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments @"message" : message, }; dispatch_async(dispatch_get_main_queue(), ^{ - events([FLTFirebasePlugin createFlutterErrorFromCode:code + events([FLTFirebasePluginHelper createFlutterErrorWithCode:code message:message optionalDetails:details andOptionalNSError:error]); diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/include/cloud_firestore/Public/FLTFirebaseFirestorePlugin.h b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/include/cloud_firestore/Public/FLTFirebaseFirestorePlugin.h index 85e38b5ee2a5..1073d7b86169 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/include/cloud_firestore/Public/FLTFirebaseFirestorePlugin.h +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/include/cloud_firestore/Public/FLTFirebaseFirestorePlugin.h @@ -10,14 +10,10 @@ #endif #import -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; #import "FirestoreMessages.g.h" @interface FLTFirebaseFirestorePlugin - : FLTFirebasePlugin + : NSObject + (NSMutableDictionary *)serverTimestampMap; @end diff --git a/packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FirebaseFunctionsPlugin.swift b/packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FirebaseFunctionsPlugin.swift index 4e15f6efa58b..d79164d5c42d 100644 --- a/packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FirebaseFunctionsPlugin.swift +++ b/packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FirebaseFunctionsPlugin.swift @@ -53,7 +53,7 @@ public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePlugin, FlutterPlugin versionNumber } - public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { completion() } @@ -92,7 +92,7 @@ public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePlugin, FlutterPlugin let parameters = arguments["parameters"] let limitedUseAppCheckToken = arguments["limitedUseAppCheckToken"] as? Bool ?? false - let app = FLTFirebasePlugin.firebaseAppNamed(appName)! + let app = FLTFirebasePluginHelper.firebaseApp(named: appName)! let functions = Functions.functions(app: app, region: region ?? "") @@ -139,7 +139,7 @@ public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePlugin, FlutterPlugin private func getFunctions(arguments: [String: Any]) -> Functions { let appName = arguments["appName"] as? String ?? "" let region = arguments["region"] as? String - let app = FLTFirebasePlugin.firebaseAppNamed(appName)! + let app = FLTFirebasePluginHelper.firebaseApp(named: appName)! return Functions.functions(app: app, region: region ?? "") } diff --git a/packages/cloud_functions/cloud_functions/macos/cloud_functions.podspec b/packages/cloud_functions/cloud_functions/macos/cloud_functions.podspec index ca265c77aff7..7557b2eda5d7 100644 --- a/packages/cloud_functions/cloud_functions/macos/cloud_functions.podspec +++ b/packages/cloud_functions/cloud_functions/macos/cloud_functions.podspec @@ -42,7 +42,6 @@ Pod::Spec.new do |s| s.authors = 'The Chromium Authors' s.source = { :path => '.' } s.source_files = 'cloud_functions/Sources/**/*.swift' - s.public_header_files = 'cloud_functions/Sources/cloud_functions/include/*.h' s.platform = :osx, '10.15' s.swift_version = '5.0' diff --git a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift index 106908ff823d..d6b603ea1c4d 100644 --- a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift +++ b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift @@ -143,7 +143,7 @@ public class FirebaseAnalyticsPlugin: NSObject, FLTFirebasePlugin, FlutterPlugin completion(.success(())) } - public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { completion() } diff --git a/packages/firebase_analytics/firebase_analytics/macos/firebase_analytics.podspec b/packages/firebase_analytics/firebase_analytics/macos/firebase_analytics.podspec index 98e9951f889c..21cbdcb88b1c 100755 --- a/packages/firebase_analytics/firebase_analytics/macos/firebase_analytics.podspec +++ b/packages/firebase_analytics/firebase_analytics/macos/firebase_analytics.podspec @@ -49,7 +49,6 @@ Pod::Spec.new do |s| s.source = { :path => '.' } s.source_files = 'firebase_analytics/Sources/firebase_analytics/**/*.swift' - s.public_header_files = 'firebase_analytics/Sources/firebase_analytics/include/*.h' s.platform = :osx, '10.13' s.swift_version = '5.0' diff --git a/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTFirebaseAppCheckPlugin.m b/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTFirebaseAppCheckPlugin.m index 7c47283e60b9..3eb1d7c3b061 100644 --- a/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTFirebaseAppCheckPlugin.m +++ b/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTFirebaseAppCheckPlugin.m @@ -6,12 +6,8 @@ #import "FLTTokenRefreshStreamHandler.h" @import FirebaseAppCheck; - -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; +@import FirebaseCore; #import "FLTAppCheckProviderFactory.h" @@ -70,7 +66,8 @@ - (void)detachFromEngineForRegistrar:(NSObject *)registr } - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)flutterResult { - FLTFirebaseMethodCallErrorBlock errorBlock = ^( + void (^errorBlock)(NSString *_Nullable, NSString *_Nullable, NSDictionary *_Nullable, + NSError *_Nullable) = ^( NSString *_Nullable code, NSString *_Nullable message, NSDictionary *_Nullable details, NSError *_Nullable error) { NSMutableDictionary *errorDetails = [NSMutableDictionary dictionary]; @@ -125,7 +122,7 @@ - (void)activate:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallResult NSString *providerName = arguments[@"appleProvider"]; NSString *debugToken = arguments[@"appleDebugToken"]; - FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:appNameDart]; + FIRApp *app = [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:appNameDart]]; [self->providerFactory configure:app providerName:providerName debugToken:debugToken]; result.success(nil); } @@ -184,11 +181,11 @@ - (void)setTokenAutoRefreshEnabled:(id)arguments #pragma mark - FLTFirebasePlugin -- (void)didReinitializeFirebaseCore:(void (^)(void))completion { +- (void)didReinitializeFirebaseCoreWithCompletion:(void (^)(void))completion { [self cleanupWithCompletion:completion]; } -- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *)firebase_app { +- (NSDictionary *_Nonnull)pluginConstantsFor:(FIRApp *)firebase_app { return @{}; } @@ -208,7 +205,7 @@ - (NSString *_Nonnull)flutterChannelName { - (FIRAppCheck *_Nullable)getFIRAppCheckFromArguments:(NSDictionary *)arguments { NSString *appNameDart = arguments[@"appName"]; - FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:appNameDart]; + FIRApp *app = [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:appNameDart]]; FIRAppCheck *appCheck = [FIRAppCheck appCheckWithApp:app]; return appCheck; diff --git a/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/include/FLTFirebaseAppCheckPlugin.h b/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/include/FLTFirebaseAppCheckPlugin.h index 9d07d0ebc671..3e5a3adcb812 100644 --- a/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/include/FLTFirebaseAppCheckPlugin.h +++ b/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/include/FLTFirebaseAppCheckPlugin.h @@ -10,12 +10,8 @@ #endif #import -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; #import "FLTAppCheckProviderFactory.h" -@interface FLTFirebaseAppCheckPlugin : FLTFirebasePlugin +@interface FLTFirebaseAppCheckPlugin : NSObject @end diff --git a/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift b/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift index 32f2640c5520..a87d397d86ce 100644 --- a/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift +++ b/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift @@ -41,15 +41,11 @@ public class FirebaseInstallationsPlugin: NSObject, FLTFirebasePlugin, FlutterPl binaryMessenger: binaryMessenger ) let instance = FirebaseInstallationsPlugin(messenger: binaryMessenger) - FLTFirebasePluginRegistry.sharedInstance().register(instance) + FLTFirebasePluginRegistry.sharedInstance().registerFirebasePlugin(instance) registrar.addMethodCallDelegate(instance, channel: channel) } - public func firebaseLibraryVersion() -> String { - versionNumber - } - - public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { completion() } @@ -72,7 +68,7 @@ public class FirebaseInstallationsPlugin: NSObject, FLTFirebasePlugin, FlutterPl /// Gets Installations instance for a Firebase App. /// - Returns: a Firebase Installations instance for the passed app from Dart private func getInstallations(appName: String) -> Installations { - let app: FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(appName)! + let app: FirebaseApp = FLTFirebasePluginHelper.firebaseApp(named: appName)! return Installations.installations(app: app) } @@ -193,12 +189,12 @@ public class FirebaseInstallationsPlugin: NSObject, FLTFirebasePlugin, FlutterPl ) } - result(FLTFirebasePlugin.createFlutterError(fromCode: errorDetails["code"] as! String, - message: errorDetails["message"] as! String, - optionalDetails: errorDetails[ - "additionalData" - ] as? [AnyHashable: Any], - andOptionalNSError: error)) + result(FLTFirebasePluginHelper.createFlutterError(code: errorDetails["code"] as! String, + message: errorDetails["message"] as! String, + optionalDetails: errorDetails[ + "additionalData" + ] as? [String: Any], + andOptionalError: error)) } switch call.method { diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m index c55ea4144e03..b3f5858614ee 100644 --- a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -3,13 +3,10 @@ // found in the LICENSE file. @import FirebaseAuth; +@import firebase_core; +@import FirebaseCore; #import #import -#if __has_include() -#import -#else -#import -#endif #import "include/Private/FLTAuthStateChannelStreamHandler.h" #import "include/Private/FLTIdTokenChannelStreamHandler.h" @@ -21,12 +18,6 @@ @import CommonCrypto; #import -#if __has_include() -#import -#else -#import -#endif - NSString *const kFLTFirebaseAuthChannelName = @"plugins.flutter.io/firebase_auth"; // Argument Keys @@ -278,7 +269,7 @@ - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDiction #pragma mark - FLTFirebasePlugin -- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { +- (void)didReinitializeFirebaseCoreWithCompletion:(void (^_Nonnull)(void))completion { [self cleanupWithCompletion:completion]; } @@ -294,7 +285,7 @@ - (NSString *_Nonnull)flutterChannelName { return kFLTFirebaseAuthChannelName; } -- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *_Nonnull)firebaseApp { +- (NSDictionary *_Nonnull)pluginConstantsFor:(FIRApp *_Nonnull)firebaseApp { FIRAuth *auth = [FIRAuth authWithApp:firebaseApp]; return @{ @"APP_LANGUAGE_CODE" : (id)[auth languageCode] ?: [NSNull null], @@ -659,7 +650,7 @@ + (NSNumber *_Nullable)storeAuthCredentialIfPresent:(NSError *)error { } - (FIRAuth *_Nullable)getFIRAuthFromAppNameFromPigeon:(AuthPigeonFirebaseApp *)pigeonApp { - FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:pigeonApp.appName]; + FIRApp *app = [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:pigeonApp.appName]]; FIRAuth *auth = [FIRAuth authWithApp:app]; auth.tenantID = pigeonApp.tenantId; diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h index ea4a0168a18d..474eb0f3e0ab 100644 --- a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h @@ -12,15 +12,11 @@ #import #import -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; #import "firebase_auth_messages.g.h" @interface FLTFirebaseAuthPlugin - : FLTFirebasePlugin ) -#import -#else -#import -#endif +@import firebase_core; +@import FirebaseCore; NSString *const kFLTFirebaseCrashlyticsChannelName = @"plugins.flutter.io/firebase_crashlytics"; NSString *const kFLTFirebaseCrashlyticsTestChannelName = @@ -75,7 +71,8 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)flutterResult { - FLTFirebaseMethodCallErrorBlock errorBlock = + void (^errorBlock)(NSString *_Nullable, NSString *_Nullable, NSDictionary *_Nullable, + NSError *_Nullable) = ^(NSString *_Nullable code, NSString *_Nullable message, NSDictionary *_Nullable details, NSError *_Nullable error) { // `result.error` is not called in this plugin so this block does nothing. @@ -239,12 +236,12 @@ - (FIRStackFrame *)generateFrame:(NSDictionary *)errorElement { #pragma mark - FLTFirebasePlugin -- (void)didReinitializeFirebaseCore:(void (^)(void))completion { +- (void)didReinitializeFirebaseCoreWithCompletion:(void (^)(void))completion { // Not required for this plugin, nothing to cleanup between reloads. completion(); } -- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *)firebase_app { +- (NSDictionary *_Nonnull)pluginConstantsFor:(FIRApp *)firebase_app { return @{ @"isCrashlyticsCollectionEnabled" : @([FIRCrashlytics crashlytics].isCrashlyticsCollectionEnabled) diff --git a/packages/firebase_crashlytics/firebase_crashlytics/ios/firebase_crashlytics/Sources/firebase_crashlytics/include/FLTFirebaseCrashlyticsPlugin.h b/packages/firebase_crashlytics/firebase_crashlytics/ios/firebase_crashlytics/Sources/firebase_crashlytics/include/FLTFirebaseCrashlyticsPlugin.h index 80bfe4d89435..483d9eb7ed50 100644 --- a/packages/firebase_crashlytics/firebase_crashlytics/ios/firebase_crashlytics/Sources/firebase_crashlytics/include/FLTFirebaseCrashlyticsPlugin.h +++ b/packages/firebase_crashlytics/firebase_crashlytics/ios/firebase_crashlytics/Sources/firebase_crashlytics/include/FLTFirebaseCrashlyticsPlugin.h @@ -10,12 +10,7 @@ #endif #import +@import firebase_core; -#if __has_include() -#import -#else -#import -#endif - -@interface FLTFirebaseCrashlyticsPlugin : FLTFirebasePlugin +@interface FLTFirebaseCrashlyticsPlugin : NSObject @end diff --git a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseObserveStreamHandler.m b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseObserveStreamHandler.m index 2d246c7c089b..a32f02b8821f 100644 --- a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseObserveStreamHandler.m +++ b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseObserveStreamHandler.m @@ -3,11 +3,8 @@ // found in the LICENSE file. @import FirebaseDatabase; -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; +@import FirebaseCore; #import "FLTFirebaseDatabaseObserveStreamHandler.h" #import "FLTFirebaseDatabaseUtils.h" @@ -54,10 +51,10 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments @"message" : message, }; dispatch_async(dispatch_get_main_queue(), ^{ - events([FLTFirebasePlugin createFlutterErrorFromCode:code - message:message - optionalDetails:details - andOptionalNSError:error]); + events([FLTFirebasePluginHelper createFlutterErrorWithCode:code + message:message + optionalDetails:details + andOptionalError:error]); }); }; diff --git a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabasePlugin.m b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabasePlugin.m index bd42988225b8..a9c94bae0555 100644 --- a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabasePlugin.m +++ b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabasePlugin.m @@ -2,11 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; +@import FirebaseCore; #import "FLTFirebaseDatabaseObserveStreamHandler.h" #import "FLTFirebaseDatabasePlugin.h" @@ -69,7 +66,8 @@ - (void)detachFromEngineForRegistrar:(NSObject *)registr } - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)flutterResult { - FLTFirebaseMethodCallErrorBlock errorBlock = + void (^errorBlock)(NSString *_Nullable, NSString *_Nullable, NSDictionary *_Nullable, + NSError *_Nullable) = ^(NSString *_Nullable code, NSString *_Nullable message, NSDictionary *_Nullable details, NSError *_Nullable error) { if (code == nil) { @@ -84,10 +82,10 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)flutter if ([@"unknown" isEqualToString:code]) { NSLog(@"FLTFirebaseDatabase: An error occurred while calling method %@", call.method); } - flutterResult([FLTFirebasePlugin createFlutterErrorFromCode:code - message:message - optionalDetails:details - andOptionalNSError:error]); + flutterResult([FLTFirebasePluginHelper createFlutterErrorWithCode:code + message:message + optionalDetails:details + andOptionalError:error]); }; FLTFirebaseMethodCallResult *methodCallResult = @@ -130,11 +128,11 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)flutter #pragma mark - FLTFirebasePlugin -- (void)didReinitializeFirebaseCore:(void (^)(void))completion { +- (void)didReinitializeFirebaseCoreWithCompletion:(void (^)(void))completion { [self cleanupWithCompletion:completion]; } -- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *)firebase_app { +- (NSDictionary *_Nonnull)pluginConstantsFor:(FIRApp *)firebase_app { return @{}; } diff --git a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseUtils.m b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseUtils.m index 21c392f02693..4c3e2aa344e7 100644 --- a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseUtils.m +++ b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseUtils.m @@ -3,11 +3,8 @@ // found in the LICENSE file. #import "FLTFirebaseDatabaseUtils.h" -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; +@import FirebaseCore; @implementation FLTFirebaseDatabaseUtils static __strong NSMutableDictionary *cachedDatabaseInstances = nil; @@ -34,7 +31,7 @@ + (FIRDatabase *)databaseFromArguments:(id)arguments { return cachedInstance; } - FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:appName]; + FIRApp *app = [FIRApp appNamed:appName]; FIRDatabase *database; if (databaseURL.length == 0) { diff --git a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/include/FLTFirebaseDatabasePlugin.h b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/include/FLTFirebaseDatabasePlugin.h index 591532786ac6..09691ab96492 100644 --- a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/include/FLTFirebaseDatabasePlugin.h +++ b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/include/FLTFirebaseDatabasePlugin.h @@ -13,11 +13,7 @@ #endif #import -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; -@interface FLTFirebaseDatabasePlugin : FLTFirebasePlugin +@interface FLTFirebaseDatabasePlugin : NSObject @end diff --git a/packages/firebase_in_app_messaging/firebase_in_app_messaging/ios/firebase_in_app_messaging/Sources/firebase_in_app_messaging/include/FirebaseInAppMessagingPlugin.h b/packages/firebase_in_app_messaging/firebase_in_app_messaging/ios/firebase_in_app_messaging/Sources/firebase_in_app_messaging/include/FirebaseInAppMessagingPlugin.h index 37ba0b5579d2..96e59e05b521 100644 --- a/packages/firebase_in_app_messaging/firebase_in_app_messaging/ios/firebase_in_app_messaging/Sources/firebase_in_app_messaging/include/FirebaseInAppMessagingPlugin.h +++ b/packages/firebase_in_app_messaging/firebase_in_app_messaging/ios/firebase_in_app_messaging/Sources/firebase_in_app_messaging/include/FirebaseInAppMessagingPlugin.h @@ -6,12 +6,7 @@ #import #import +@import firebase_core; -#if __has_include() -#import -#else -#import -#endif - -@interface FirebaseInAppMessagingPlugin : FLTFirebasePlugin +@interface FirebaseInAppMessagingPlugin : NSObject @end diff --git a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m index d62ffdc0dc2f..e92d3b12c6c7 100644 --- a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m +++ b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m @@ -4,11 +4,8 @@ #import #import -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; +@import FirebaseCore; #import #import "FLTFirebaseMessagingPlugin.h" @@ -93,31 +90,32 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)flutterResult { - FLTFirebaseMethodCallErrorBlock errorBlock = ^( - NSString *_Nullable code, NSString *_Nullable message, NSDictionary *_Nullable details, - NSError *_Nullable error) { - if (code == nil) { - NSDictionary *errorDetails = [self NSDictionaryForNSError:error]; - code = errorDetails[kMessagingArgumentCode]; - message = errorDetails[kMessagingArgumentMessage]; - details = errorDetails; - } else { - details = @{ - kMessagingArgumentCode : code, - kMessagingArgumentMessage : message, - }; - } + void (^errorBlock)(NSString *_Nullable, NSString *_Nullable, NSDictionary *_Nullable, + NSError *_Nullable) = + ^(NSString *_Nullable code, NSString *_Nullable message, NSDictionary *_Nullable details, + NSError *_Nullable error) { + if (code == nil) { + NSDictionary *errorDetails = [self NSDictionaryForNSError:error]; + code = errorDetails[kMessagingArgumentCode]; + message = errorDetails[kMessagingArgumentMessage]; + details = errorDetails; + } else { + details = @{ + kMessagingArgumentCode : code, + kMessagingArgumentMessage : message, + }; + } - if ([@"unknown" isEqualToString:code]) { - NSLog(@"FLTFirebaseMessaging: An error occurred while calling method %@, errorOrNil => %@", - call.method, [error userInfo]); - } + if ([@"unknown" isEqualToString:code]) { + NSLog(@"FLTFirebaseMessaging: An error occurred while calling method %@, errorOrNil => %@", + call.method, [error userInfo]); + } - flutterResult([FLTFirebasePlugin createFlutterErrorFromCode:code - message:message - optionalDetails:details - andOptionalNSError:error]); - }; + flutterResult([FLTFirebasePluginHelper createFlutterErrorWithCode:code + message:message + optionalDetails:details + andOptionalError:error]); + }; FLTFirebaseMethodCallResult *methodCallResult = [FLTFirebaseMethodCallResult createWithSuccess:flutterResult andErrorBlock:errorBlock]; @@ -291,7 +289,7 @@ - (void)application_onDidFinishLaunchingNotification:(nonnull NSNotification *)n } if (shouldReplaceDelegate) { - __strong FLTFirebasePlugin *strongSelf = self; + __strong FLTFirebaseMessagingPlugin *strongSelf = self; notificationCenter.delegate = strongSelf; } } @@ -686,11 +684,11 @@ - (void)messagingDeleteToken:(id)arguments #pragma mark - FLTFirebasePlugin -- (void)didReinitializeFirebaseCore:(void (^)(void))completion { +- (void)didReinitializeFirebaseCoreWithCompletion:(void (^)(void))completion { completion(); } -- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *)firebase_app { +- (NSDictionary *_Nonnull)pluginConstantsFor:(FIRApp *)firebase_app { return @{ @"AUTO_INIT_ENABLED" : @([FIRMessaging messaging].isAutoInitEnabled), }; diff --git a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h index 2f32bac24d5d..dea100ee9bc3 100644 --- a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h +++ b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h @@ -14,11 +14,7 @@ #import #import -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 #define __FF_NOTIFICATIONS_SUPPORTED_PLATFORM @@ -31,13 +27,13 @@ #if TARGET_OS_OSX #ifdef __FF_NOTIFICATIONS_SUPPORTED_PLATFORM -@interface FLTFirebaseMessagingPlugin : FLTFirebasePlugin #else -@interface FLTFirebaseMessagingPlugin : FLTFirebasePlugin @@ -45,14 +41,14 @@ #else #ifdef __FF_NOTIFICATIONS_SUPPORTED_PLATFORM API_AVAILABLE(ios(10.0)) -@interface FLTFirebaseMessagingPlugin : FLTFirebasePlugin #else @interface FLTFirebaseMessagingPlugin - : FLTFirebasePlugin + : NSObject #endif #endif @end diff --git a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift index bc0c13a36df8..9b2ee2f64bdb 100644 --- a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift +++ b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift @@ -34,18 +34,14 @@ public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePlugin, Flutter binaryMessenger: binaryMessenger ) let instance = FirebaseModelDownloaderPlugin() - FLTFirebasePluginRegistry.sharedInstance().register(instance) + FLTFirebasePluginRegistry.sharedInstance().registerFirebasePlugin(instance) registrar.addMethodCallDelegate(instance, channel: channel) #if os(iOS) registrar.publish(instance) #endif } - public func firebaseLibraryVersion() -> String { - versionNumber - } - - public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { completion() } @@ -98,12 +94,12 @@ public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePlugin, Flutter NSLog("FLTFirebaseModelDownloader: An error occurred while calling method %@", call.method) } - result(FLTFirebasePlugin.createFlutterError(fromCode: errorDetails["code"] as! String, + result(FLTFirebasePluginHelper.createFlutterError(code: errorDetails["code"] as! String, message: errorDetails["message"] as! String, optionalDetails: errorDetails[ "additionalData" - ] as? [AnyHashable: Any], - andOptionalNSError: nil)) + ] as? [String: Any], + andOptionalError: nil as Error?)) } let result = FLTFirebaseMethodCallResult.create(success: result, andErrorBlock: errorBlock) @@ -193,7 +189,7 @@ public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePlugin, Flutter } func modelDownloaderFromArguments(arguments: [String: Any]) -> ModelDownloader? { - let app: FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(arguments["appName"] as! String)! + let app: FirebaseApp = FLTFirebasePluginHelper.firebaseApp(named: arguments["appName"] as! String)! return ModelDownloader.modelDownloader(app: app) } } diff --git a/packages/firebase_performance/firebase_performance/ios/firebase_performance/Package.swift b/packages/firebase_performance/firebase_performance/ios/firebase_performance/Package.swift index b47de11bb2ec..32a63487c11a 100644 --- a/packages/firebase_performance/firebase_performance/ios/firebase_performance/Package.swift +++ b/packages/firebase_performance/firebase_performance/ios/firebase_performance/Package.swift @@ -109,11 +109,6 @@ let package = Package( ], resources: [ .process("Resources"), - ], - cSettings: [ - .headerSearchPath("include"), - .define("LIBRARY_VERSION", to: "\"\(library_version)\""), - .define("LIBRARY_NAME", to: "\"flutter-fire-perf\""), ] ), ] diff --git a/packages/firebase_performance/firebase_performance/ios/firebase_performance/Sources/firebase_performance/FirebasePerformancePlugin.swift b/packages/firebase_performance/firebase_performance/ios/firebase_performance/Sources/firebase_performance/FirebasePerformancePlugin.swift index 99397b2f272c..1270f3fed3c7 100644 --- a/packages/firebase_performance/firebase_performance/ios/firebase_performance/Sources/firebase_performance/FirebasePerformancePlugin.swift +++ b/packages/firebase_performance/firebase_performance/ios/firebase_performance/Sources/firebase_performance/FirebasePerformancePlugin.swift @@ -22,7 +22,7 @@ extension FlutterError: Error {} public class FirebasePerformancePlugin: NSObject, FlutterPlugin, FLTFirebasePlugin, FirebasePerformanceHostApi { - public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { completion() } diff --git a/packages/firebase_remote_config/firebase_remote_config/ios/firebase_remote_config/Sources/firebase_remote_config/FirebaseRemoteConfigPlugin.swift b/packages/firebase_remote_config/firebase_remote_config/ios/firebase_remote_config/Sources/firebase_remote_config/FirebaseRemoteConfigPlugin.swift index f3f98478bd5a..5418b474d980 100644 --- a/packages/firebase_remote_config/firebase_remote_config/ios/firebase_remote_config/Sources/firebase_remote_config/FirebaseRemoteConfigPlugin.swift +++ b/packages/firebase_remote_config/firebase_remote_config/ios/firebase_remote_config/Sources/firebase_remote_config/FirebaseRemoteConfigPlugin.swift @@ -60,7 +60,7 @@ public class FirebaseRemoteConfigPlugin: NSObject, FlutterPlugin, FlutterStreamH } } - public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { completion() } @@ -214,7 +214,7 @@ public class FirebaseRemoteConfigPlugin: NSObject, FlutterPlugin, FlutterStreamH } private func getRemoteConfig(from appName: String) -> RemoteConfig { - let app = FLTFirebasePlugin.firebaseAppNamed(appName) + let app = FLTFirebasePluginHelper.firebaseApp(named: appName) return RemoteConfig.remoteConfig(app: app!) } diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage.podspec b/packages/firebase_storage/firebase_storage/ios/firebase_storage.podspec index 7a475510a123..e5d55cd7b69a 100755 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage.podspec +++ b/packages/firebase_storage/firebase_storage/ios/firebase_storage.podspec @@ -25,8 +25,7 @@ Pod::Spec.new do |s| s.authors = 'The Chromium Authors' s.source = { :path => '.' } - s.source_files = 'firebase_storage/Sources/firebase_storage/**/*.{h,m,swift}' - s.public_header_files = 'firebase_storage/Sources/firebase_storage/include/*.h' + s.source_files = 'firebase_storage/Sources/firebase_storage/**/*.swift' s.swift_version = '5.0' diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Package.swift b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Package.swift index 52214ea17003..53f0cfb1bbd1 100644 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Package.swift +++ b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Package.swift @@ -104,11 +104,6 @@ let package = Package( ], resources: [ .process("Resources"), - ], - cSettings: [ - .headerSearchPath("include"), - .define("LIBRARY_VERSION", to: "\"\(library_version)\""), - .define("LIBRARY_NAME", to: "\"flutter-fire-gcs\""), ] ), ] diff --git a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift index 2696d2c9f94d..e60d54eea250 100644 --- a/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift +++ b/packages/firebase_storage/firebase_storage/ios/firebase_storage/Sources/firebase_storage/FLTFirebaseStoragePlugin.swift @@ -55,7 +55,7 @@ public final class FLTFirebaseStoragePlugin: NSObject, FlutterPlugin, FirebaseSt private func storage(app: PigeonStorageFirebaseApp) -> Storage { let base = "gs://" + app.bucket - let firApp = FLTFirebasePlugin.firebaseAppNamed(app.appName)! + let firApp = FLTFirebasePluginHelper.firebaseApp(named: app.appName)! return Storage.storage(app: firApp, url: base) } @@ -332,7 +332,7 @@ public final class FLTFirebaseStoragePlugin: NSObject, FlutterPlugin, FirebaseSt let uuid = UUID().uuidString let channelName = "plugins.flutter.io/firebase_storage/taskEvent/\(uuid)" let channel = FlutterEventChannel(name: channelName, binaryMessenger: messenger!) - let storageInstance = Storage.storage(app: FLTFirebasePlugin.firebaseAppNamed(appName)!) + let storageInstance = Storage.storage(app: FLTFirebasePluginHelper.firebaseApp(named: appName)!) channel.setStreamHandler(TaskStateChannelStreamHandler( task: task, storage: storageInstance, diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage.podspec b/packages/firebase_storage/firebase_storage/macos/firebase_storage.podspec index 12c7a116a466..f2afd459132f 100755 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage.podspec +++ b/packages/firebase_storage/firebase_storage/macos/firebase_storage.podspec @@ -43,8 +43,7 @@ Pod::Spec.new do |s| s.authors = 'The Chromium Authors' s.source = { :path => '.' } - s.source_files = 'firebase_storage/Sources/firebase_storage/**/*.{h,m,swift}' - s.public_header_files = 'firebase_storage/Sources/firebase_storage/include/*.h' + s.source_files = 'firebase_storage/Sources/firebase_storage/**/*.swift' s.platform = :osx, '10.13' diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Package.swift b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Package.swift index 2362a8817283..55f1a2ce7f48 100644 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Package.swift +++ b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Package.swift @@ -106,11 +106,6 @@ let package = Package( ], resources: [ .process("Resources"), - ], - cSettings: [ - .headerSearchPath("include"), - .define("LIBRARY_VERSION", to: "\"\(library_version)\""), - .define("LIBRARY_NAME", to: "\"flutter-fire-gcs\""), ] ), ] From f5e77664325a7b6c6ced289e6c8ab209fb73c841 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Wed, 5 Nov 2025 09:08:07 +0000 Subject: [PATCH 09/17] format: swift format --- .../FirebaseAnalyticsPlugin.swift | 2 +- .../FirebaseInstallationsPlugin.swift | 4 +- .../firebase_core/FLTFirebaseCorePlugin.swift | 414 +++++++++--------- .../firebase_core/FLTFirebasePlugin.swift | 189 ++++---- .../FLTFirebasePluginRegistry.swift | 148 +++---- .../Sources/firebase_core/messages.g.swift | 177 +++++--- .../FirebaseModelDownloaderPlugin.swift | 13 +- 7 files changed, 494 insertions(+), 453 deletions(-) diff --git a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift index d6b603ea1c4d..ed816e41234f 100644 --- a/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift +++ b/packages/firebase_analytics/firebase_analytics/ios/firebase_analytics/Sources/firebase_analytics/FirebaseAnalyticsPlugin.swift @@ -13,8 +13,8 @@ #else import firebase_core_shared #endif -import FirebaseCore import FirebaseAnalytics +import FirebaseCore let kFLTFirebaseAnalyticsName = "name" let kFLTFirebaseAnalyticsValue = "value" diff --git a/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift b/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift index a87d397d86ce..0e43d5163add 100644 --- a/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift +++ b/packages/firebase_app_installations/firebase_app_installations/ios/firebase_app_installations/Sources/firebase_app_installations/FirebaseInstallationsPlugin.swift @@ -190,7 +190,9 @@ public class FirebaseInstallationsPlugin: NSObject, FLTFirebasePlugin, FlutterPl } result(FLTFirebasePluginHelper.createFlutterError(code: errorDetails["code"] as! String, - message: errorDetails["message"] as! String, + message: errorDetails[ + "message" + ] as! String, optionalDetails: errorDetails[ "additionalData" ] as? [String: Any], diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift index 155b7d2dac5a..3dbfcf7b2e68 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift @@ -6,229 +6,227 @@ import FirebaseCore import Foundation #if os(macOS) -import FlutterMacOS + import FlutterMacOS #else -import Flutter + import Flutter #endif -@objc public class FLTFirebaseCorePlugin: FLTFirebasePluginHelper, FlutterPlugin, FLTFirebasePlugin, FirebaseCoreHostApi, FirebaseAppHostApi { - private var coreInitialized = false - private static var customAuthDomains: [String: String] = [:] - - // MARK: - FlutterPlugin - - @objc public static func register(with registrar: FlutterPluginRegistrar) { - let instance = sharedInstance() - #if !os(macOS) - registrar.publish(instance) - #endif - FirebaseCoreHostApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) - FirebaseAppHostApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) - } - - // Returns a singleton instance of the Firebase Core plugin. - @objc public static func sharedInstance() -> FLTFirebaseCorePlugin { - struct Singleton { - static let instance: FLTFirebaseCorePlugin = { - let instance = FLTFirebaseCorePlugin() - // Register with the Flutter Firebase plugin registry. - FLTFirebasePluginRegistry.shared.registerFirebasePlugin(instance) - - // Initialize default Firebase app, but only if the plist file options exist. - // - If it is missing then there is no default app discovered in Dart and - // Dart throws an error. - // - Without this the iOS/MacOS app would crash immediately on calling - // FirebaseApp.configure() without providing helpful context about the crash to the user. - // - // Default app exists check is for backwards compatibility of legacy - // FlutterFire plugins that call FirebaseApp.configure() themselves internally. - if let options = FirebaseOptions.defaultOptions(), - FirebaseApp.app(name: kFIRDefaultAppNameIOS) == nil { - FirebaseApp.configure(options: options) - } - - return instance - }() +@objc public class FLTFirebaseCorePlugin: FLTFirebasePluginHelper, FlutterPlugin, FLTFirebasePlugin, + FirebaseCoreHostApi, FirebaseAppHostApi { + private var coreInitialized = false + private static var customAuthDomains: [String: String] = [:] + + // MARK: - FlutterPlugin + + @objc public static func register(with registrar: FlutterPluginRegistrar) { + let instance = sharedInstance() + #if !os(macOS) + registrar.publish(instance) + #endif + FirebaseCoreHostApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) + FirebaseAppHostApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) + } + + // Returns a singleton instance of the Firebase Core plugin. + @objc public static func sharedInstance() -> FLTFirebaseCorePlugin { + enum Singleton { + static let instance: FLTFirebaseCorePlugin = { + let instance = FLTFirebaseCorePlugin() + // Register with the Flutter Firebase plugin registry. + FLTFirebasePluginRegistry.shared.registerFirebasePlugin(instance) + + // Initialize default Firebase app, but only if the plist file options exist. + // - If it is missing then there is no default app discovered in Dart and + // Dart throws an error. + // - Without this the iOS/MacOS app would crash immediately on calling + // FirebaseApp.configure() without providing helpful context about the crash to the user. + // + // Default app exists check is for backwards compatibility of legacy + // FlutterFire plugins that call FirebaseApp.configure() themselves internally. + if let options = FirebaseOptions.defaultOptions(), + FirebaseApp.app(name: kFIRDefaultAppNameIOS) == nil { + FirebaseApp.configure(options: options) } - return Singleton.instance - } - - @objc public static func getCustomDomain(_ appName: String) -> String? { - return customAuthDomains[appName] - } - - // MARK: - Helpers - - private func optionsFromFIROptions(_ options: FirebaseOptions) -> CoreFirebaseOptions { - return CoreFirebaseOptions( - apiKey: options.apiKey ?? "", - appId: options.googleAppID, - messagingSenderId: options.gcmSenderID, - projectId: options.projectID ?? "", - databaseURL: options.databaseURL, - storageBucket: options.storageBucket, - iosClientId: options.clientID, - iosBundleId: options.bundleID, - appGroupId: options.appGroupID - ) + + return instance + }() } - - private func initializeResponse(from firebaseApp: FirebaseApp) -> CoreInitializeResponse { - let appNameDart = FLTFirebasePluginHelper.firebaseAppName(fromIosName: firebaseApp.name) - return CoreInitializeResponse( - name: appNameDart, - options: optionsFromFIROptions(firebaseApp.options), - isAutomaticDataCollectionEnabled: firebaseApp.isDataCollectionDefaultEnabled, - pluginConstants: FLTFirebasePluginRegistry.shared.pluginConstants(forFIRApp: firebaseApp) - ) + return Singleton.instance + } + + @objc public static func getCustomDomain(_ appName: String) -> String? { + customAuthDomains[appName] + } + + // MARK: - Helpers + + private func optionsFromFIROptions(_ options: FirebaseOptions) -> CoreFirebaseOptions { + CoreFirebaseOptions( + apiKey: options.apiKey ?? "", + appId: options.googleAppID, + messagingSenderId: options.gcmSenderID, + projectId: options.projectID ?? "", + databaseURL: options.databaseURL, + storageBucket: options.storageBucket, + iosClientId: options.clientID, + iosBundleId: options.bundleID, + appGroupId: options.appGroupID + ) + } + + private func initializeResponse(from firebaseApp: FirebaseApp) -> CoreInitializeResponse { + let appNameDart = FLTFirebasePluginHelper.firebaseAppName(fromIosName: firebaseApp.name) + return CoreInitializeResponse( + name: appNameDart, + options: optionsFromFIROptions(firebaseApp.options), + isAutomaticDataCollectionEnabled: firebaseApp.isDataCollectionDefaultEnabled, + pluginConstants: FLTFirebasePluginRegistry.shared.pluginConstants(forFIRApp: firebaseApp) + ) + } + + // MARK: - FLTFirebasePlugin + + @objc public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { + completion() + } + + @objc public func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] { + [:] + } + + @objc public var firebaseLibraryName: String { + "flutter-fire-core" + } + + @objc public var firebaseLibraryVersion: String { + // TODO: Get version from Package.swift or build configuration + "4.2.0" + } + + @objc public var flutterChannelName: String { + // The pigeon channel depends on each function + "dev.flutter.pigeon.FirebaseCoreHostApi.initializeApp" + } + + // MARK: - API + + func initializeApp(appName: String, + initializeAppRequest: CoreFirebaseOptions, + completion: @escaping (Result) -> Void) { + let appNameIos = FLTFirebasePluginHelper.firebaseAppName(fromDartName: appName) + + if let existingApp = FLTFirebasePluginHelper.firebaseApp(named: appName) { + completion(.success(initializeResponse(from: existingApp))) + return } - - // MARK: - FLTFirebasePlugin - - @objc public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { - completion() + + let appId = initializeAppRequest.appId + let messagingSenderId = initializeAppRequest.messagingSenderId + + let options = FirebaseOptions(googleAppID: appId, gcmSenderID: messagingSenderId) + options.apiKey = initializeAppRequest.apiKey + options.projectID = initializeAppRequest.projectId + + if let databaseURL = initializeAppRequest.databaseURL { + options.databaseURL = databaseURL } - - @objc public func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] { - return [:] + + if let storageBucket = initializeAppRequest.storageBucket { + options.storageBucket = storageBucket } - - @objc public var firebaseLibraryName: String { - return "flutter-fire-core" + + if let iosBundleId = initializeAppRequest.iosBundleId { + options.bundleID = iosBundleId } - - @objc public var firebaseLibraryVersion: String { - // TODO: Get version from Package.swift or build configuration - return "4.2.0" + + if let iosClientId = initializeAppRequest.iosClientId { + options.clientID = iosClientId } - - @objc public var flutterChannelName: String { - // The pigeon channel depends on each function - return "dev.flutter.pigeon.FirebaseCoreHostApi.initializeApp" + + if let appGroupId = initializeAppRequest.appGroupId { + options.appGroupID = appGroupId } - - // MARK: - API - - func initializeApp( - appName: String, - initializeAppRequest: CoreFirebaseOptions, - completion: @escaping (Result) -> Void - ) { - let appNameIos = FLTFirebasePluginHelper.firebaseAppName(fromDartName: appName) - - if let existingApp = FLTFirebasePluginHelper.firebaseApp(named: appName) { - completion(.success(initializeResponse(from: existingApp))) - return - } - - let appId = initializeAppRequest.appId - let messagingSenderId = initializeAppRequest.messagingSenderId - - let options = FirebaseOptions(googleAppID: appId, gcmSenderID: messagingSenderId) - options.apiKey = initializeAppRequest.apiKey - options.projectID = initializeAppRequest.projectId - - if let databaseURL = initializeAppRequest.databaseURL { - options.databaseURL = databaseURL - } - - if let storageBucket = initializeAppRequest.storageBucket { - options.storageBucket = storageBucket - } - - if let iosBundleId = initializeAppRequest.iosBundleId { - options.bundleID = iosBundleId - } - - if let iosClientId = initializeAppRequest.iosClientId { - options.clientID = iosClientId - } - - if let appGroupId = initializeAppRequest.appGroupId { - options.appGroupID = appGroupId - } - - if let authDomain = initializeAppRequest.authDomain { - FLTFirebaseCorePlugin.customAuthDomains[appNameIos] = authDomain - } - - FirebaseApp.configure(name: appNameIos, options: options) - - if let firebaseApp = FirebaseApp.app(name: appNameIos) { - completion(.success(initializeResponse(from: firebaseApp))) - } else { - completion(.failure(NSError(domain: "FLTFirebaseCore", - code: -1, - userInfo: [NSLocalizedDescriptionKey: "Failed to configure Firebase app"]))) - } + + if let authDomain = initializeAppRequest.authDomain { + FLTFirebaseCorePlugin.customAuthDomains[appNameIos] = authDomain } - - func initializeCore(completion: @escaping (Result<[CoreInitializeResponse], Error>) -> Void) { - let initializeCoreBlock: () -> Void = { - var firebaseAppsArray: [CoreInitializeResponse] = [] - - if let firebaseApps = FirebaseApp.allApps { - for (_, firebaseApp) in firebaseApps { - firebaseAppsArray.append(self.initializeResponse(from: firebaseApp)) - } - } - - completion(.success(firebaseAppsArray)) - } - - if !coreInitialized { - coreInitialized = true - initializeCoreBlock() - } else { - FLTFirebasePluginRegistry.shared.didReinitializeFirebaseCore(completion: initializeCoreBlock) + + FirebaseApp.configure(name: appNameIos, options: options) + + if let firebaseApp = FirebaseApp.app(name: appNameIos) { + completion(.success(initializeResponse(from: firebaseApp))) + } else { + completion(.failure(NSError(domain: "FLTFirebaseCore", + code: -1, + userInfo: [ + NSLocalizedDescriptionKey: "Failed to configure Firebase app", + ]))) + } + } + + func initializeCore(completion: @escaping (Result<[CoreInitializeResponse], Error>) -> Void) { + let initializeCoreBlock: () -> Void = { + var firebaseAppsArray: [CoreInitializeResponse] = [] + + if let firebaseApps = FirebaseApp.allApps { + for (_, firebaseApp) in firebaseApps { + firebaseAppsArray.append(self.initializeResponse(from: firebaseApp)) } + } + + completion(.success(firebaseAppsArray)) } - - func optionsFromResource(completion: @escaping (Result) -> Void) { - // Unsupported on iOS/MacOS - return empty options with minimal required fields - completion(.success(CoreFirebaseOptions( - apiKey: "", - appId: "", - messagingSenderId: "", - projectId: "" - ))) - } - - func delete(appName: String, completion: @escaping (Result) -> Void) { - guard let firebaseApp = FLTFirebasePluginHelper.firebaseApp(named: appName) else { - completion(.success(())) - return - } - - firebaseApp.delete { success in - if success { - completion(.success(())) - } else { - completion(.failure(NSError(domain: "FLTFirebaseCore", - code: -1, - userInfo: [NSLocalizedDescriptionKey: "Failed to delete a Firebase app instance."]))) - } - } + + if !coreInitialized { + coreInitialized = true + initializeCoreBlock() + } else { + FLTFirebasePluginRegistry.shared.didReinitializeFirebaseCore(completion: initializeCoreBlock) } - - func setAutomaticDataCollectionEnabled( - appName: String, - enabled: Bool, - completion: @escaping (Result) -> Void - ) { - if let firebaseApp = FLTFirebasePluginHelper.firebaseApp(named: appName) { - firebaseApp.isDataCollectionDefaultEnabled = enabled - } - completion(.success(())) + } + + func optionsFromResource(completion: @escaping (Result) -> Void) { + // Unsupported on iOS/MacOS - return empty options with minimal required fields + completion(.success(CoreFirebaseOptions( + apiKey: "", + appId: "", + messagingSenderId: "", + projectId: "" + ))) + } + + func delete(appName: String, completion: @escaping (Result) -> Void) { + guard let firebaseApp = FLTFirebasePluginHelper.firebaseApp(named: appName) else { + completion(.success(())) + return } - - func setAutomaticResourceManagementEnabled( - appName: String, - enabled: Bool, - completion: @escaping (Result) -> Void - ) { - // Unsupported on iOS/MacOS. + + firebaseApp.delete { success in + if success { completion(.success(())) - } -} + } else { + completion(.failure(NSError(domain: "FLTFirebaseCore", + code: -1, + userInfo: [ + NSLocalizedDescriptionKey: "Failed to delete a Firebase app instance.", + ]))) + } + } + } + + func setAutomaticDataCollectionEnabled(appName: String, + enabled: Bool, + completion: @escaping (Result) -> Void) { + if let firebaseApp = FLTFirebasePluginHelper.firebaseApp(named: appName) { + firebaseApp.isDataCollectionDefaultEnabled = enabled + } + completion(.success(())) + } + func setAutomaticResourceManagementEnabled(appName: String, + enabled: Bool, + completion: @escaping (Result) -> Void) { + // Unsupported on iOS/MacOS. + completion(.success(())) + } +} diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift index 5af6d99040a3..3a61be4a330c 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift @@ -6,9 +6,9 @@ import FirebaseCore import Foundation #if os(macOS) -import FlutterMacOS + import FlutterMacOS #else -import Flutter + import Flutter #endif // Firebase default app names @@ -19,107 +19,108 @@ let kFIRDefaultAppNameDart = "[DEFAULT]" public typealias FLTFirebaseMethodCallSuccessBlock = (Any?) -> Void /// Block that is capable of sending an error response to a method call operation. -public typealias FLTFirebaseMethodCallErrorBlock = (String?, String?, [String: Any]?, Error?) -> Void +public typealias FLTFirebaseMethodCallErrorBlock = (String?, String?, [String: Any]?, Error?) + -> Void /// A protocol that all FlutterFire plugins should implement. @objc public protocol FLTFirebasePlugin { - /// FlutterFire plugins implementing FLTFirebasePlugin should provide this method - /// to be notified when FirebaseCore#initializeCore was called again (first time is ignored). - /// - /// This can be used by plugins to know when they might need to cleanup previous - /// resources between Hot Restarts as `initializeCore` can only be called once in Dart. - @objc func didReinitializeFirebaseCore(completion: @escaping () -> Void) - - /// FlutterFire plugins implementing FLTFirebasePlugin must provide this method - /// to provide it's constants that are initialized during FirebaseCore.initializeApp in Dart. - /// - /// - Parameter firebaseApp: The Firebase App that the plugin should return constants for. - /// - Returns: A dictionary of constants for the plugin. - @objc func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] - - /// The Firebase library name of the plugin, used by FirebaseApp.registerLibrary - /// to register this plugin with the Firebase backend. - @objc var firebaseLibraryName: String { get } - - /// The Firebase library version of the plugin, used by FirebaseApp.registerLibrary - /// to register this plugin with the Firebase backend. - @objc var firebaseLibraryVersion: String { get } - - /// FlutterFire plugins implementing FLTFirebasePlugin must provide this method - /// to provide its main method channel name, used by FirebaseCore.initializeApp - /// in Dart to identify constants specific to a plugin. - @objc var flutterChannelName: String { get } + /// FlutterFire plugins implementing FLTFirebasePlugin should provide this method + /// to be notified when FirebaseCore#initializeCore was called again (first time is ignored). + /// + /// This can be used by plugins to know when they might need to cleanup previous + /// resources between Hot Restarts as `initializeCore` can only be called once in Dart. + @objc func didReinitializeFirebaseCore(completion: @escaping () -> Void) + + /// FlutterFire plugins implementing FLTFirebasePlugin must provide this method + /// to provide it's constants that are initialized during FirebaseCore.initializeApp in Dart. + /// + /// - Parameter firebaseApp: The Firebase App that the plugin should return constants for. + /// - Returns: A dictionary of constants for the plugin. + @objc func pluginConstants(for firebaseApp: FirebaseApp) -> [String: Any] + + /// The Firebase library name of the plugin, used by FirebaseApp.registerLibrary + /// to register this plugin with the Firebase backend. + @objc var firebaseLibraryName: String { get } + + /// The Firebase library version of the plugin, used by FirebaseApp.registerLibrary + /// to register this plugin with the Firebase backend. + @objc var firebaseLibraryVersion: String { get } + + /// FlutterFire plugins implementing FLTFirebasePlugin must provide this method + /// to provide its main method channel name, used by FirebaseCore.initializeApp + /// in Dart to identify constants specific to a plugin. + @objc var flutterChannelName: String { get } } /// An interface representing a returned result from a Flutter Method Call. @objc public class FLTFirebaseMethodCallResult: NSObject { - @objc public let success: FLTFirebaseMethodCallSuccessBlock - @objc public let error: FLTFirebaseMethodCallErrorBlock - - private init(success: @escaping FLTFirebaseMethodCallSuccessBlock, - error: @escaping FLTFirebaseMethodCallErrorBlock) { - self.success = success - self.error = error - super.init() - } - - @objc public static func create(success: @escaping FLTFirebaseMethodCallSuccessBlock, - andErrorBlock error: @escaping FLTFirebaseMethodCallErrorBlock) -> FLTFirebaseMethodCallResult { - return FLTFirebaseMethodCallResult(success: success, error: error) - } + @objc public let success: FLTFirebaseMethodCallSuccessBlock + @objc public let error: FLTFirebaseMethodCallErrorBlock + + private init(success: @escaping FLTFirebaseMethodCallSuccessBlock, + error: @escaping FLTFirebaseMethodCallErrorBlock) { + self.success = success + self.error = error + super.init() + } + + @objc public static func create(success: @escaping FLTFirebaseMethodCallSuccessBlock, + andErrorBlock error: @escaping FLTFirebaseMethodCallErrorBlock) + -> FLTFirebaseMethodCallResult { + FLTFirebaseMethodCallResult(success: success, error: error) + } } @objc open class FLTFirebasePluginHelper: NSObject { - /// Creates a standardized instance of FlutterError using the values returned - /// through FLTFirebaseMethodCallErrorBlock. - /// - /// - Parameters: - /// - code: Error Code. - /// - message: Error Message. - /// - details: Optional dictionary of additional key/values to return to Dart. - /// - error: Optional Error that this error relates to. - /// - Returns: FlutterError instance. - @objc public static func createFlutterError(code: String, - message: String, - optionalDetails details: [String: Any]?, - andOptionalError error: Error?) -> FlutterError { - var detailsDict = details ?? [:] - if let error = error as NSError? { - detailsDict["nativeErrorCode"] = String(error.code) - detailsDict["nativeErrorMessage"] = error.localizedDescription - } - return FlutterError(code: code, message: message, details: detailsDict) + /// Creates a standardized instance of FlutterError using the values returned + /// through FLTFirebaseMethodCallErrorBlock. + /// + /// - Parameters: + /// - code: Error Code. + /// - message: Error Message. + /// - details: Optional dictionary of additional key/values to return to Dart. + /// - error: Optional Error that this error relates to. + /// - Returns: FlutterError instance. + @objc public static func createFlutterError(code: String, + message: String, + optionalDetails details: [String: Any]?, + andOptionalError error: Error?) -> FlutterError { + var detailsDict = details ?? [:] + if let error = error as NSError? { + detailsDict["nativeErrorCode"] = String(error.code) + detailsDict["nativeErrorMessage"] = error.localizedDescription } - - /// Converts the '[DEFAULT]' app name used in dart and other SDKs to the - /// '__FIRAPP_DEFAULT' iOS equivalent. - /// - /// If name is not '[DEFAULT]' then just returns the same name that was passed in. - /// - /// - Parameter appName: The name of the Firebase App. - /// - Returns: The iOS-compatible app name. - @objc public static func firebaseAppName(fromDartName appName: String) -> String { - return appName == kFIRDefaultAppNameDart ? kFIRDefaultAppNameIOS : appName - } - - /// Converts the '__FIRAPP_DEFAULT' app name used in iOS to '[DEFAULT]' - used in - /// Dart & other SDKs. - /// - /// If name is not '__FIRAPP_DEFAULT' then just returns the same name that was passed in. - /// - /// - Parameter appName: The name of the Firebase App. - /// - Returns: The Dart-compatible app name. - @objc public static func firebaseAppName(fromIosName appName: String) -> String { - return appName == kFIRDefaultAppNameIOS ? kFIRDefaultAppNameDart : appName - } - - /// Retrieves a FirebaseApp instance based on the app name provided from Dart code. - /// - /// - Parameter appName: The name of the Firebase App. - /// - Returns: FirebaseApp instance, or nil if it doesn't exist. - @objc public static func firebaseApp(named appName: String) -> FirebaseApp? { - let iosName = firebaseAppName(fromDartName: appName) - return FirebaseApp.app(name: iosName) - } -} + return FlutterError(code: code, message: message, details: detailsDict) + } + /// Converts the '[DEFAULT]' app name used in dart and other SDKs to the + /// '__FIRAPP_DEFAULT' iOS equivalent. + /// + /// If name is not '[DEFAULT]' then just returns the same name that was passed in. + /// + /// - Parameter appName: The name of the Firebase App. + /// - Returns: The iOS-compatible app name. + @objc public static func firebaseAppName(fromDartName appName: String) -> String { + appName == kFIRDefaultAppNameDart ? kFIRDefaultAppNameIOS : appName + } + + /// Converts the '__FIRAPP_DEFAULT' app name used in iOS to '[DEFAULT]' - used in + /// Dart & other SDKs. + /// + /// If name is not '__FIRAPP_DEFAULT' then just returns the same name that was passed in. + /// + /// - Parameter appName: The name of the Firebase App. + /// - Returns: The Dart-compatible app name. + @objc public static func firebaseAppName(fromIosName appName: String) -> String { + appName == kFIRDefaultAppNameIOS ? kFIRDefaultAppNameDart : appName + } + + /// Retrieves a FirebaseApp instance based on the app name provided from Dart code. + /// + /// - Parameter appName: The name of the Firebase App. + /// - Returns: FirebaseApp instance, or nil if it doesn't exist. + @objc public static func firebaseApp(named appName: String) -> FirebaseApp? { + let iosName = firebaseAppName(fromDartName: appName) + return FirebaseApp.app(name: iosName) + } +} diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift index 3da6dad42e03..9629f7128a78 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift @@ -6,85 +6,85 @@ import FirebaseCore import Foundation #if canImport(FirebaseCoreInternal) -import FirebaseCoreInternal + import FirebaseCoreInternal #endif @objc public class FLTFirebasePluginRegistry: NSObject { - private var registeredPlugins: [String: FLTFirebasePlugin] = [:] - - private override init() { - super.init() - } - - /// Get the shared singleton instance of the plugin registry. - /// - /// - Returns: Shared FLTFirebasePluginRegistry instance. - @objc public static let shared = FLTFirebasePluginRegistry() - - /// For compatibility with Objective-C code - @objc public static func sharedInstance() -> FLTFirebasePluginRegistry { - return shared + private var registeredPlugins: [String: FLTFirebasePlugin] = [:] + + override private init() { + super.init() + } + + /// Get the shared singleton instance of the plugin registry. + /// + /// - Returns: Shared FLTFirebasePluginRegistry instance. + @objc public static let shared = FLTFirebasePluginRegistry() + + /// For compatibility with Objective-C code + @objc public static func sharedInstance() -> FLTFirebasePluginRegistry { + shared + } + + /// Register a FlutterFire plugin with the plugin registry. + /// + /// Plugins must conform to the FLTFirebasePlugin protocol. + /// + /// - Parameter firebasePlugin: The plugin conforming to FLTFirebasePlugin protocol. + @objc public func registerFirebasePlugin(_ firebasePlugin: FLTFirebasePlugin) { + // Register the library with the Firebase backend using runtime checking + // for compatibility across different Firebase SDK versions. + if FirebaseApp.responds(to: NSSelectorFromString("registerLibrary:withVersion:")) { + FirebaseApp.perform( + NSSelectorFromString("registerLibrary:withVersion:"), + with: firebasePlugin.firebaseLibraryName, + with: firebasePlugin.firebaseLibraryVersion + ) } - - /// Register a FlutterFire plugin with the plugin registry. - /// - /// Plugins must conform to the FLTFirebasePlugin protocol. - /// - /// - Parameter firebasePlugin: The plugin conforming to FLTFirebasePlugin protocol. - @objc public func registerFirebasePlugin(_ firebasePlugin: FLTFirebasePlugin) { - // Register the library with the Firebase backend using runtime checking - // for compatibility across different Firebase SDK versions. - if FirebaseApp.responds(to: NSSelectorFromString("registerLibrary:withVersion:")) { - FirebaseApp.perform( - NSSelectorFromString("registerLibrary:withVersion:"), - with: firebasePlugin.firebaseLibraryName, - with: firebasePlugin.firebaseLibraryVersion - ) - } - - // Store the plugin delegate for later usage. - registeredPlugins[firebasePlugin.flutterChannelName] = firebasePlugin + + // Store the plugin delegate for later usage. + registeredPlugins[firebasePlugin.flutterChannelName] = firebasePlugin + } + + /// Each FlutterFire plugin implementing FLTFirebasePlugin provides this method, + /// allowing its constants to be initialized during FirebaseCore.initializeApp in Dart. + /// Here we call this method on each of the registered plugins and gather their constants for use + /// in Dart. + /// + /// Constants for specific plugins are stored using the Flutter plugins channel name as the key. + /// + /// - Parameter firebaseApp: Firebase App instance these constants relate to. + /// - Returns: Dictionary of plugins and their constants. + @objc public func pluginConstants(forFIRApp firebaseApp: FirebaseApp) -> [String: Any] { + var pluginConstants: [String: Any] = [:] + + for (channelName, plugin) in registeredPlugins { + pluginConstants[channelName] = plugin.pluginConstants(for: firebaseApp) } - - /// Each FlutterFire plugin implementing FLTFirebasePlugin provides this method, - /// allowing its constants to be initialized during FirebaseCore.initializeApp in Dart. - /// Here we call this method on each of the registered plugins and gather their constants for use in Dart. - /// - /// Constants for specific plugins are stored using the Flutter plugins channel name as the key. - /// - /// - Parameter firebaseApp: Firebase App instance these constants relate to. - /// - Returns: Dictionary of plugins and their constants. - @objc public func pluginConstants(forFIRApp firebaseApp: FirebaseApp) -> [String: Any] { - var pluginConstants: [String: Any] = [:] - - for (channelName, plugin) in registeredPlugins { - pluginConstants[channelName] = plugin.pluginConstants(for: firebaseApp) - } - - return pluginConstants + + return pluginConstants + } + + /// Each FlutterFire plugin implementing this method are notified that + /// FirebaseCore#initializeCore was called again. + /// + /// This is used by plugins to know if they need to cleanup previous + /// resources between Hot Restarts as `initializeCore` can only be called once in Dart. + /// + /// - Parameter completion: Completion handler called when all plugins have completed. + @objc public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { + var pluginsCompleted = 0 + let pluginsCount = registeredPlugins.count + + let allPluginsCompletion: () -> Void = { + pluginsCompleted += 1 + if pluginsCompleted == pluginsCount { + completion() + } } - - /// Each FlutterFire plugin implementing this method are notified that - /// FirebaseCore#initializeCore was called again. - /// - /// This is used by plugins to know if they need to cleanup previous - /// resources between Hot Restarts as `initializeCore` can only be called once in Dart. - /// - /// - Parameter completion: Completion handler called when all plugins have completed. - @objc public func didReinitializeFirebaseCore(completion: @escaping () -> Void) { - var pluginsCompleted = 0 - let pluginsCount = registeredPlugins.count - - let allPluginsCompletion: () -> Void = { - pluginsCompleted += 1 - if pluginsCompleted == pluginsCount { - completion() - } - } - - for plugin in registeredPlugins.values { - plugin.didReinitializeFirebaseCore(completion: allPluginsCompletion) - } + + for plugin in registeredPlugins.values { + plugin.didReinitializeFirebaseCore(completion: allPluginsCompletion) } + } } - diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.swift index 5865f87fd6bb..8068b28371ed 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.swift @@ -27,13 +27,12 @@ final class PigeonError: Error { } var localizedDescription: String { - return - "PigeonError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" + "PigeonError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" } } private func wrapResult(_ result: Any?) -> [Any?] { - return [result] + [result] } private func wrapError(_ error: Any) -> [Any?] { @@ -59,7 +58,7 @@ private func wrapError(_ error: Any) -> [Any?] { } private func isNullish(_ value: Any?) -> Bool { - return value is NSNull || value == nil + value is NSNull || value == nil } private func nilOrValue(_ value: Any?) -> T? { @@ -103,19 +102,22 @@ func deepEqualsmessages(_ lhs: Any?, _ rhs: Any?) -> Bool { return true default: - // Any other type shouldn't be able to be used with pigeon. File an issue if you find this to be untrue. + // Any other type shouldn't be able to be used with pigeon. File an issue if you find this to be + // untrue. return false } } func deepHashmessages(value: Any?, hasher: inout Hasher) { if let valueList = value as? [AnyHashable] { - for item in valueList { deepHashmessages(value: item, hasher: &hasher) } - return + for item in valueList { + deepHashmessages(value: item, hasher: &hasher) + } + return } if let valueDict = value as? [AnyHashable: AnyHashable] { - for key in valueDict.keys { + for key in valueDict.keys { hasher.combine(key) deepHashmessages(value: valueDict[key]!, hasher: &hasher) } @@ -129,25 +131,22 @@ func deepHashmessages(value: Any?, hasher: inout Hasher) { return hasher.combine(String(describing: value)) } - - /// Generated class from Pigeon that represents data sent in messages. struct CoreFirebaseOptions: Hashable { var apiKey: String var appId: String var messagingSenderId: String var projectId: String - var authDomain: String? = nil - var databaseURL: String? = nil - var storageBucket: String? = nil - var measurementId: String? = nil - var trackingId: String? = nil - var deepLinkURLScheme: String? = nil - var androidClientId: String? = nil - var iosClientId: String? = nil - var iosBundleId: String? = nil - var appGroupId: String? = nil - + var authDomain: String? + var databaseURL: String? + var storageBucket: String? + var measurementId: String? + var trackingId: String? + var deepLinkURLScheme: String? + var androidClientId: String? + var iosClientId: String? + var iosBundleId: String? + var appGroupId: String? // swift-format-ignore: AlwaysUseLowerCamelCase static func fromList(_ pigeonVar_list: [Any?]) -> CoreFirebaseOptions? { @@ -183,8 +182,9 @@ struct CoreFirebaseOptions: Hashable { appGroupId: appGroupId ) } + func toList() -> [Any?] { - return [ + [ apiKey, appId, messagingSenderId, @@ -201,8 +201,11 @@ struct CoreFirebaseOptions: Hashable { appGroupId, ] } + static func == (lhs: CoreFirebaseOptions, rhs: CoreFirebaseOptions) -> Bool { - return deepEqualsmessages(lhs.toList(), rhs.toList()) } + deepEqualsmessages(lhs.toList(), rhs.toList()) + } + func hash(into hasher: inout Hasher) { deepHashmessages(value: toList(), hasher: &hasher) } @@ -212,10 +215,9 @@ struct CoreFirebaseOptions: Hashable { struct CoreInitializeResponse: Hashable { var name: String var options: CoreFirebaseOptions - var isAutomaticDataCollectionEnabled: Bool? = nil + var isAutomaticDataCollectionEnabled: Bool? var pluginConstants: [String?: Any?] - // swift-format-ignore: AlwaysUseLowerCamelCase static func fromList(_ pigeonVar_list: [Any?]) -> CoreInitializeResponse? { let name = pigeonVar_list[0] as! String @@ -230,16 +232,20 @@ struct CoreInitializeResponse: Hashable { pluginConstants: pluginConstants ) } + func toList() -> [Any?] { - return [ + [ name, options, isAutomaticDataCollectionEnabled, pluginConstants, ] } + static func == (lhs: CoreInitializeResponse, rhs: CoreInitializeResponse) -> Bool { - return deepEqualsmessages(lhs.toList(), rhs.toList()) } + deepEqualsmessages(lhs.toList(), rhs.toList()) + } + func hash(into hasher: inout Hasher) { deepHashmessages(value: toList(), hasher: &hasher) } @@ -249,9 +255,9 @@ private class MessagesPigeonCodecReader: FlutterStandardReader { override func readValue(ofType type: UInt8) -> Any? { switch type { case 129: - return CoreFirebaseOptions.fromList(self.readValue() as! [Any?]) + return CoreFirebaseOptions.fromList(readValue() as! [Any?]) case 130: - return CoreInitializeResponse.fromList(self.readValue() as! [Any?]) + return CoreInitializeResponse.fromList(readValue() as! [Any?]) default: return super.readValue(ofType: type) } @@ -274,11 +280,11 @@ private class MessagesPigeonCodecWriter: FlutterStandardWriter { private class MessagesPigeonCodecReaderWriter: FlutterStandardReaderWriter { override func reader(with data: Data) -> FlutterStandardReader { - return MessagesPigeonCodecReader(data: data) + MessagesPigeonCodecReader(data: data) } override func writer(with data: NSMutableData) -> FlutterStandardWriter { - return MessagesPigeonCodecWriter(data: data) + MessagesPigeonCodecWriter(data: data) } } @@ -286,10 +292,10 @@ class MessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { static let shared = MessagesPigeonCodec(readerWriter: MessagesPigeonCodecReaderWriter()) } - /// Generated protocol from Pigeon that represents a handler of messages from Flutter. protocol FirebaseCoreHostApi { - func initializeApp(appName: String, initializeAppRequest: CoreFirebaseOptions, completion: @escaping (Result) -> Void) + func initializeApp(appName: String, initializeAppRequest: CoreFirebaseOptions, + completion: @escaping (Result) -> Void) func initializeCore(completion: @escaping (Result<[CoreInitializeResponse], Error>) -> Void) func optionsFromResource(completion: @escaping (Result) -> Void) } @@ -298,34 +304,45 @@ protocol FirebaseCoreHostApi { class FirebaseCoreHostApiSetup { static var codec: FlutterStandardMessageCodec { MessagesPigeonCodec.shared } /// Sets up an instance of `FirebaseCoreHostApi` to handle messages through the `binaryMessenger`. - static func setUp(binaryMessenger: FlutterBinaryMessenger, api: FirebaseCoreHostApi?, messageChannelSuffix: String = "") { + static func setUp(binaryMessenger: FlutterBinaryMessenger, api: FirebaseCoreHostApi?, + messageChannelSuffix: String = "") { let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" - let initializeAppChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { + let initializeAppChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp\(channelSuffix)", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { initializeAppChannel.setMessageHandler { message, reply in let args = message as! [Any?] let appNameArg = args[0] as! String let initializeAppRequestArg = args[1] as! CoreFirebaseOptions - api.initializeApp(appName: appNameArg, initializeAppRequest: initializeAppRequestArg) { result in - switch result { - case .success(let res): - reply(wrapResult(res)) - case .failure(let error): - reply(wrapError(error)) + api + .initializeApp(appName: appNameArg, + initializeAppRequest: initializeAppRequestArg) { result in + switch result { + case let .success(res): + reply(wrapResult(res)) + case let .failure(error): + reply(wrapError(error)) + } } - } } } else { initializeAppChannel.setMessageHandler(nil) } - let initializeCoreChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { + let initializeCoreChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore\(channelSuffix)", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { initializeCoreChannel.setMessageHandler { _, reply in api.initializeCore { result in switch result { - case .success(let res): + case let .success(res): reply(wrapResult(res)) - case .failure(let error): + case let .failure(error): reply(wrapError(error)) } } @@ -333,14 +350,18 @@ class FirebaseCoreHostApiSetup { } else { initializeCoreChannel.setMessageHandler(nil) } - let optionsFromResourceChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { + let optionsFromResourceChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource\(channelSuffix)", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { optionsFromResourceChannel.setMessageHandler { _, reply in api.optionsFromResource { result in switch result { - case .success(let res): + case let .success(res): reply(wrapResult(res)) - case .failure(let error): + case let .failure(error): reply(wrapError(error)) } } @@ -350,10 +371,13 @@ class FirebaseCoreHostApiSetup { } } } + /// Generated protocol from Pigeon that represents a handler of messages from Flutter. protocol FirebaseAppHostApi { - func setAutomaticDataCollectionEnabled(appName: String, enabled: Bool, completion: @escaping (Result) -> Void) - func setAutomaticResourceManagementEnabled(appName: String, enabled: Bool, completion: @escaping (Result) -> Void) + func setAutomaticDataCollectionEnabled(appName: String, enabled: Bool, + completion: @escaping (Result) -> Void) + func setAutomaticResourceManagementEnabled(appName: String, enabled: Bool, + completion: @escaping (Result) -> Void) func delete(appName: String, completion: @escaping (Result) -> Void) } @@ -361,10 +385,15 @@ protocol FirebaseAppHostApi { class FirebaseAppHostApiSetup { static var codec: FlutterStandardMessageCodec { MessagesPigeonCodec.shared } /// Sets up an instance of `FirebaseAppHostApi` to handle messages through the `binaryMessenger`. - static func setUp(binaryMessenger: FlutterBinaryMessenger, api: FirebaseAppHostApi?, messageChannelSuffix: String = "") { + static func setUp(binaryMessenger: FlutterBinaryMessenger, api: FirebaseAppHostApi?, + messageChannelSuffix: String = "") { let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" - let setAutomaticDataCollectionEnabledChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { + let setAutomaticDataCollectionEnabledChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled\(channelSuffix)", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { setAutomaticDataCollectionEnabledChannel.setMessageHandler { message, reply in let args = message as! [Any?] let appNameArg = args[0] as! String @@ -373,7 +402,7 @@ class FirebaseAppHostApiSetup { switch result { case .success: reply(wrapResult(nil)) - case .failure(let error): + case let .failure(error): reply(wrapError(error)) } } @@ -381,26 +410,36 @@ class FirebaseAppHostApiSetup { } else { setAutomaticDataCollectionEnabledChannel.setMessageHandler(nil) } - let setAutomaticResourceManagementEnabledChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { + let setAutomaticResourceManagementEnabledChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled\(channelSuffix)", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { setAutomaticResourceManagementEnabledChannel.setMessageHandler { message, reply in let args = message as! [Any?] let appNameArg = args[0] as! String let enabledArg = args[1] as! Bool - api.setAutomaticResourceManagementEnabled(appName: appNameArg, enabled: enabledArg) { result in - switch result { - case .success: - reply(wrapResult(nil)) - case .failure(let error): - reply(wrapError(error)) + api + .setAutomaticResourceManagementEnabled(appName: appNameArg, + enabled: enabledArg) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case let .failure(error): + reply(wrapError(error)) + } } - } } } else { setAutomaticResourceManagementEnabledChannel.setMessageHandler(nil) } - let deleteChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) - if let api = api { + let deleteChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete\(channelSuffix)", + binaryMessenger: binaryMessenger, + codec: codec + ) + if let api { deleteChannel.setMessageHandler { message, reply in let args = message as! [Any?] let appNameArg = args[0] as! String @@ -408,7 +447,7 @@ class FirebaseAppHostApiSetup { switch result { case .success: reply(wrapResult(nil)) - case .failure(let error): + case let .failure(error): reply(wrapError(error)) } } diff --git a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift index 9b2ee2f64bdb..b4354a0a8fef 100644 --- a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift +++ b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift @@ -95,11 +95,11 @@ public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePlugin, Flutter } result(FLTFirebasePluginHelper.createFlutterError(code: errorDetails["code"] as! String, - message: errorDetails["message"] as! String, - optionalDetails: errorDetails[ - "additionalData" - ] as? [String: Any], - andOptionalError: nil as Error?)) + message: errorDetails["message"] as! String, + optionalDetails: errorDetails[ + "additionalData" + ] as? [String: Any], + andOptionalError: nil as Error?)) } let result = FLTFirebaseMethodCallResult.create(success: result, andErrorBlock: errorBlock) @@ -189,7 +189,8 @@ public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePlugin, Flutter } func modelDownloaderFromArguments(arguments: [String: Any]) -> ModelDownloader? { - let app: FirebaseApp = FLTFirebasePluginHelper.firebaseApp(named: arguments["appName"] as! String)! + let app: FirebaseApp = FLTFirebasePluginHelper + .firebaseApp(named: arguments["appName"] as! String)! return ModelDownloader.modelDownloader(app: app) } } From 096073c905193f11844f36d8d405aec525078d27 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Wed, 5 Nov 2025 09:25:15 +0000 Subject: [PATCH 10/17] format: dart-objc --- .../FLTDocumentSnapshotStreamHandler.m | 6 +- .../FLTFirebaseFirestorePlugin.m | 3 +- .../FLTFirebaseFirestoreReader.m | 3 +- .../FLTLoadBundleStreamHandler.m | 6 +- .../FLTQuerySnapshotStreamHandler.m | 6 +- .../FLTFirebaseAppCheckPlugin.m | 6 +- .../firebase_auth/FLTFirebaseAuthPlugin.m | 3 +- .../include/Public/FLTFirebaseAuthPlugin.h | 19 +- .../lib/src/pigeon/messages.pigeon.dart | 110 ++++++----- .../lib/src/pigeon/test_api.dart | 176 ++++++++++++------ .../FLTFirebaseDatabaseObserveStreamHandler.m | 6 +- .../FLTFirebaseDatabasePlugin.m | 8 +- .../FLTFirebaseMessagingPlugin.m | 46 ++--- .../include/FLTFirebaseMessagingPlugin.h | 22 +-- 14 files changed, 253 insertions(+), 167 deletions(-) diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m index dd9a399e62d8..ac679cc3e568 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m @@ -49,9 +49,9 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments }; dispatch_async(dispatch_get_main_queue(), ^{ events([FLTFirebasePluginHelper createFlutterErrorWithCode:code - message:message - optionalDetails:details - andOptionalNSError:error]); + message:message + optionalDetails:details + andOptionalNSError:error]); }); } else { dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m index 115c878bfb46..44b0f40904fa 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m @@ -220,7 +220,8 @@ - (FIRFirestore *_Nullable)getFIRFirestoreFromAppNameFromPigeon: NSString *appNameDart = pigeonApp.appName; NSString *databaseUrl = pigeonApp.databaseURL; - FIRApp *app = [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:appNameDart]]; + FIRApp *app = + [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:appNameDart]]; if ([FLTFirebaseFirestoreUtils getFirestoreInstanceByName:app.name databaseURL:databaseUrl] != nil) { diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreReader.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreReader.m index f0d4b38e8a0d..70fdc803bf0d 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreReader.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreReader.m @@ -293,7 +293,8 @@ - (FIRFirestore *)FIRFirestore { NSString *appNameDart = [self readValue]; NSString *databaseUrl = [self readValue]; FIRFirestoreSettings *settings = [self readValue]; - FIRApp *app = [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:appNameDart]]; + FIRApp *app = + [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:appNameDart]]; if ([FLTFirebaseFirestoreUtils getFirestoreInstanceByName:app.name databaseURL:databaseUrl] != nil) { diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m index ad13d445790e..08629bb8926a 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m @@ -53,9 +53,9 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments dispatch_async(dispatch_get_main_queue(), ^{ events([FLTFirebasePluginHelper createFlutterErrorWithCode:code - message:message - optionalDetails:details - andOptionalNSError:error]); + message:message + optionalDetails:details + andOptionalNSError:error]); }); } }]; diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m index 70469601fd3e..e66b1eb86bfa 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m @@ -59,9 +59,9 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments }; dispatch_async(dispatch_get_main_queue(), ^{ events([FLTFirebasePluginHelper createFlutterErrorWithCode:code - message:message - optionalDetails:details - andOptionalNSError:error]); + message:message + optionalDetails:details + andOptionalNSError:error]); }); } else { dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTFirebaseAppCheckPlugin.m b/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTFirebaseAppCheckPlugin.m index 3eb1d7c3b061..9c0e4375d994 100644 --- a/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTFirebaseAppCheckPlugin.m +++ b/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTFirebaseAppCheckPlugin.m @@ -67,9 +67,9 @@ - (void)detachFromEngineForRegistrar:(NSObject *)registr - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)flutterResult { void (^errorBlock)(NSString *_Nullable, NSString *_Nullable, NSDictionary *_Nullable, - NSError *_Nullable) = ^( - NSString *_Nullable code, NSString *_Nullable message, NSDictionary *_Nullable details, - NSError *_Nullable error) { + NSError *_Nullable) = ^(NSString *_Nullable code, NSString *_Nullable message, + NSDictionary *_Nullable details, + NSError *_Nullable error) { NSMutableDictionary *errorDetails = [NSMutableDictionary dictionary]; NSString *errorCode; diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m index b3f5858614ee..9539c92bb8ef 100644 --- a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -650,7 +650,8 @@ + (NSNumber *_Nullable)storeAuthCredentialIfPresent:(NSError *)error { } - (FIRAuth *_Nullable)getFIRAuthFromAppNameFromPigeon:(AuthPigeonFirebaseApp *)pigeonApp { - FIRApp *app = [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:pigeonApp.appName]]; + FIRApp *app = + [FIRApp appNamed:[FLTFirebasePluginHelper firebaseAppNameFromDartName:pigeonApp.appName]]; FIRAuth *auth = [FIRAuth authWithApp:app]; auth.tenantID = pigeonApp.tenantId; diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h index 474eb0f3e0ab..ba81174d62d5 100644 --- a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h @@ -15,16 +15,15 @@ @import firebase_core; #import "firebase_auth_messages.g.h" -@interface FLTFirebaseAuthPlugin - : NSObject +@interface FLTFirebaseAuthPlugin : NSObject + (FlutterError *)convertToFlutterError:(NSError *)error; @end diff --git a/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/messages.pigeon.dart b/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/messages.pigeon.dart index 0d0f49ec28c7..d07a1ca4b84a 100644 --- a/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/messages.pigeon.dart +++ b/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/messages.pigeon.dart @@ -18,7 +18,8 @@ PlatformException _createConnectionError(String channelName) { ); } -List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { +List wrapResponse( + {Object? result, PlatformException? error, bool empty = false}) { if (empty) { return []; } @@ -27,21 +28,22 @@ List wrapResponse({Object? result, PlatformException? error, bool empty } return [error.code, error.message, error.details]; } + bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && a.indexed - .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); + .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); } if (a is Map && b is Map) { - return a.length == b.length && a.entries.every((MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key])); + return a.length == b.length && + a.entries.every((MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key])); } return a == b; } - class CoreFirebaseOptions { CoreFirebaseOptions({ required this.apiKey, @@ -108,7 +110,8 @@ class CoreFirebaseOptions { } Object encode() { - return _toList(); } + return _toList(); + } static CoreFirebaseOptions decode(Object result) { result as List; @@ -144,8 +147,7 @@ class CoreFirebaseOptions { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class CoreInitializeResponse { @@ -174,7 +176,8 @@ class CoreInitializeResponse { } Object encode() { - return _toList(); } + return _toList(); + } static CoreInitializeResponse decode(Object result) { result as List; @@ -182,7 +185,8 @@ class CoreInitializeResponse { name: result[0]! as String, options: result[1]! as CoreFirebaseOptions, isAutomaticDataCollectionEnabled: result[2] as bool?, - pluginConstants: (result[3] as Map?)!.cast(), + pluginConstants: + (result[3] as Map?)!.cast(), ); } @@ -200,11 +204,9 @@ class CoreInitializeResponse { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -212,10 +214,10 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is CoreFirebaseOptions) { + } else if (value is CoreFirebaseOptions) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is CoreInitializeResponse) { + } else if (value is CoreInitializeResponse) { buffer.putUint8(130); writeValue(buffer, value.encode()); } else { @@ -226,9 +228,9 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return CoreFirebaseOptions.decode(readValue(buffer)!); - case 130: + case 130: return CoreInitializeResponse.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -240,23 +242,29 @@ class FirebaseCoreHostApi { /// Constructor for [FirebaseCoreHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - FirebaseCoreHostApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + FirebaseCoreHostApi( + {BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + pigeonVar_messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); final String pigeonVar_messageChannelSuffix; - Future initializeApp(String appName, CoreFirebaseOptions initializeAppRequest) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + Future initializeApp( + String appName, CoreFirebaseOptions initializeAppRequest) async { + final String pigeonVar_channelName = + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([appName, initializeAppRequest]); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([appName, initializeAppRequest]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -278,8 +286,10 @@ class FirebaseCoreHostApi { } Future> initializeCore() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + final String pigeonVar_channelName = + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, @@ -301,13 +311,16 @@ class FirebaseCoreHostApi { message: 'Host platform returned null value for non-null return value.', ); } else { - return (pigeonVar_replyList[0] as List?)!.cast(); + return (pigeonVar_replyList[0] as List?)! + .cast(); } } Future optionsFromResource() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + final String pigeonVar_channelName = + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, @@ -338,23 +351,29 @@ class FirebaseAppHostApi { /// Constructor for [FirebaseAppHostApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - FirebaseAppHostApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + FirebaseAppHostApi( + {BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + pigeonVar_messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); final String pigeonVar_messageChannelSuffix; - Future setAutomaticDataCollectionEnabled(String appName, bool enabled) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + Future setAutomaticDataCollectionEnabled( + String appName, bool enabled) async { + final String pigeonVar_channelName = + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([appName, enabled]); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([appName, enabled]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -370,14 +389,18 @@ class FirebaseAppHostApi { } } - Future setAutomaticResourceManagementEnabled(String appName, bool enabled) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + Future setAutomaticResourceManagementEnabled( + String appName, bool enabled) async { + final String pigeonVar_channelName = + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([appName, enabled]); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([appName, enabled]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -394,13 +417,16 @@ class FirebaseAppHostApi { } Future delete(String appName) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + final String pigeonVar_channelName = + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([appName]); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([appName]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { diff --git a/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/test_api.dart b/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/test_api.dart index 184aeef7fd61..fbf2394b4022 100644 --- a/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/test_api.dart +++ b/packages/firebase_core/firebase_core_platform_interface/lib/src/pigeon/test_api.dart @@ -13,7 +13,6 @@ import 'package:flutter_test/flutter_test.dart'; import 'messages.pigeon.dart'; - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -21,10 +20,10 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is CoreFirebaseOptions) { + } else if (value is CoreFirebaseOptions) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is CoreInitializeResponse) { + } else if (value is CoreInitializeResponse) { buffer.putUint8(130); writeValue(buffer, value.encode()); } else { @@ -35,9 +34,9 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return CoreFirebaseOptions.decode(readValue(buffer)!); - case 130: + case 130: return CoreInitializeResponse.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -46,79 +45,110 @@ class _PigeonCodec extends StandardMessageCodec { } abstract class TestFirebaseCoreHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); - Future initializeApp(String appName, CoreFirebaseOptions initializeAppRequest); + Future initializeApp( + String appName, CoreFirebaseOptions initializeAppRequest); Future> initializeCore(); Future optionsFromResource(); - static void setUp(TestFirebaseCoreHostApi? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + TestFirebaseCoreHostApi? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; { - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp$messageChannelSuffix', pigeonChannelCodec, + final BasicMessageChannel< + Object?> pigeonVar_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp$messageChannelSuffix', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp was null.'); + 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp was null.'); final List args = (message as List?)!; final String? arg_appName = (args[0] as String?); assert(arg_appName != null, 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp was null, expected non-null String.'); - final CoreFirebaseOptions? arg_initializeAppRequest = (args[1] as CoreFirebaseOptions?); + final CoreFirebaseOptions? arg_initializeAppRequest = + (args[1] as CoreFirebaseOptions?); assert(arg_initializeAppRequest != null, 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeApp was null, expected non-null CoreFirebaseOptions.'); try { - final CoreInitializeResponse output = await api.initializeApp(arg_appName!, arg_initializeAppRequest!); + final CoreInitializeResponse output = await api.initializeApp( + arg_appName!, arg_initializeAppRequest!); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore$messageChannelSuffix', pigeonChannelCodec, + final BasicMessageChannel< + Object?> pigeonVar_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.initializeCore$messageChannelSuffix', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, + (Object? message) async { try { - final List output = await api.initializeCore(); + final List output = + await api.initializeCore(); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource$messageChannelSuffix', pigeonChannelCodec, + final BasicMessageChannel< + Object?> pigeonVar_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseCoreHostApi.optionsFromResource$messageChannelSuffix', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, + (Object? message) async { try { final CoreFirebaseOptions output = await api.optionsFromResource(); return [output]; } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } @@ -127,27 +157,40 @@ abstract class TestFirebaseCoreHostApi { } abstract class TestFirebaseAppHostApi { - static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance; + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); Future setAutomaticDataCollectionEnabled(String appName, bool enabled); - Future setAutomaticResourceManagementEnabled(String appName, bool enabled); + Future setAutomaticResourceManagementEnabled( + String appName, bool enabled); Future delete(String appName); - static void setUp(TestFirebaseAppHostApi? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + TestFirebaseAppHostApi? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; { - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled$messageChannelSuffix', pigeonChannelCodec, + final BasicMessageChannel< + Object?> pigeonVar_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled$messageChannelSuffix', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled was null.'); + 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled was null.'); final List args = (message as List?)!; final String? arg_appName = (args[0] as String?); assert(arg_appName != null, @@ -156,26 +199,34 @@ abstract class TestFirebaseAppHostApi { assert(arg_enabled != null, 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticDataCollectionEnabled was null, expected non-null bool.'); try { - await api.setAutomaticDataCollectionEnabled(arg_appName!, arg_enabled!); + await api.setAutomaticDataCollectionEnabled( + arg_appName!, arg_enabled!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled$messageChannelSuffix', pigeonChannelCodec, + final BasicMessageChannel< + Object?> pigeonVar_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled$messageChannelSuffix', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled was null.'); + 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled was null.'); final List args = (message as List?)!; final String? arg_appName = (args[0] as String?); assert(arg_appName != null, @@ -184,26 +235,34 @@ abstract class TestFirebaseAppHostApi { assert(arg_enabled != null, 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.setAutomaticResourceManagementEnabled was null, expected non-null bool.'); try { - await api.setAutomaticResourceManagementEnabled(arg_appName!, arg_enabled!); + await api.setAutomaticResourceManagementEnabled( + arg_appName!, arg_enabled!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } } { - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete$messageChannelSuffix', pigeonChannelCodec, + final BasicMessageChannel< + Object?> pigeonVar_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete$messageChannelSuffix', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, null); } else { - _testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler(pigeonVar_channel, (Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(pigeonVar_channel, + (Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete was null.'); + 'Argument for dev.flutter.pigeon.firebase_core_platform_interface.FirebaseAppHostApi.delete was null.'); final List args = (message as List?)!; final String? arg_appName = (args[0] as String?); assert(arg_appName != null, @@ -213,8 +272,9 @@ abstract class TestFirebaseAppHostApi { return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); } }); } diff --git a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseObserveStreamHandler.m b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseObserveStreamHandler.m index a32f02b8821f..15a2df835a00 100644 --- a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseObserveStreamHandler.m +++ b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabaseObserveStreamHandler.m @@ -52,9 +52,9 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments }; dispatch_async(dispatch_get_main_queue(), ^{ events([FLTFirebasePluginHelper createFlutterErrorWithCode:code - message:message - optionalDetails:details - andOptionalError:error]); + message:message + optionalDetails:details + andOptionalError:error]); }); }; diff --git a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabasePlugin.m b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabasePlugin.m index a9c94bae0555..30a293bfaaa7 100644 --- a/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabasePlugin.m +++ b/packages/firebase_database/firebase_database/ios/firebase_database/Sources/firebase_database/FLTFirebaseDatabasePlugin.m @@ -5,8 +5,8 @@ @import firebase_core; @import FirebaseCore; -#import "FLTFirebaseDatabaseObserveStreamHandler.h" #import "FLTFirebaseDatabasePlugin.h" +#import "FLTFirebaseDatabaseObserveStreamHandler.h" #import "FLTFirebaseDatabaseUtils.h" NSString *const kFLTFirebaseDatabaseChannelName = @"plugins.flutter.io/firebase_database"; @@ -83,9 +83,9 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)flutter NSLog(@"FLTFirebaseDatabase: An error occurred while calling method %@", call.method); } flutterResult([FLTFirebasePluginHelper createFlutterErrorWithCode:code - message:message - optionalDetails:details - andOptionalError:error]); + message:message + optionalDetails:details + andOptionalError:error]); }; FLTFirebaseMethodCallResult *methodCallResult = diff --git a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m index e92d3b12c6c7..8efa03a01a15 100644 --- a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m +++ b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/FLTFirebaseMessagingPlugin.m @@ -91,31 +91,31 @@ + (void)registerWithRegistrar:(NSObject *)registrar { - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)flutterResult { void (^errorBlock)(NSString *_Nullable, NSString *_Nullable, NSDictionary *_Nullable, - NSError *_Nullable) = - ^(NSString *_Nullable code, NSString *_Nullable message, NSDictionary *_Nullable details, - NSError *_Nullable error) { - if (code == nil) { - NSDictionary *errorDetails = [self NSDictionaryForNSError:error]; - code = errorDetails[kMessagingArgumentCode]; - message = errorDetails[kMessagingArgumentMessage]; - details = errorDetails; - } else { - details = @{ - kMessagingArgumentCode : code, - kMessagingArgumentMessage : message, - }; - } + NSError *_Nullable) = ^(NSString *_Nullable code, NSString *_Nullable message, + NSDictionary *_Nullable details, + NSError *_Nullable error) { + if (code == nil) { + NSDictionary *errorDetails = [self NSDictionaryForNSError:error]; + code = errorDetails[kMessagingArgumentCode]; + message = errorDetails[kMessagingArgumentMessage]; + details = errorDetails; + } else { + details = @{ + kMessagingArgumentCode : code, + kMessagingArgumentMessage : message, + }; + } - if ([@"unknown" isEqualToString:code]) { - NSLog(@"FLTFirebaseMessaging: An error occurred while calling method %@, errorOrNil => %@", - call.method, [error userInfo]); - } + if ([@"unknown" isEqualToString:code]) { + NSLog(@"FLTFirebaseMessaging: An error occurred while calling method %@, errorOrNil => %@", + call.method, [error userInfo]); + } - flutterResult([FLTFirebasePluginHelper createFlutterErrorWithCode:code - message:message - optionalDetails:details - andOptionalError:error]); - }; + flutterResult([FLTFirebasePluginHelper createFlutterErrorWithCode:code + message:message + optionalDetails:details + andOptionalError:error]); + }; FLTFirebaseMethodCallResult *methodCallResult = [FLTFirebaseMethodCallResult createWithSuccess:flutterResult andErrorBlock:errorBlock]; diff --git a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h index dea100ee9bc3..698580ee1ba5 100644 --- a/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h +++ b/packages/firebase_messaging/firebase_messaging/ios/firebase_messaging/Sources/firebase_messaging/include/FLTFirebaseMessagingPlugin.h @@ -28,24 +28,22 @@ #if TARGET_OS_OSX #ifdef __FF_NOTIFICATIONS_SUPPORTED_PLATFORM @interface FLTFirebaseMessagingPlugin : NSObject + FLTFirebasePlugin, + FIRMessagingDelegate, + NSApplicationDelegate, + UNUserNotificationCenterDelegate> #else -@interface FLTFirebaseMessagingPlugin : NSObject +@interface FLTFirebaseMessagingPlugin + : NSObject #endif #else #ifdef __FF_NOTIFICATIONS_SUPPORTED_PLATFORM API_AVAILABLE(ios(10.0)) @interface FLTFirebaseMessagingPlugin : NSObject + FLTFirebasePlugin, + FIRMessagingDelegate, + UIApplicationDelegate, + UNUserNotificationCenterDelegate> #else @interface FLTFirebaseMessagingPlugin : NSObject From 784235dd033e4685a3e32a17606453836eacd92a Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Wed, 5 Nov 2025 09:37:07 +0000 Subject: [PATCH 11/17] fix: macos symLink --- Package.swift | 14 +++++----- .../FLTFirebaseCorePlugin.m | 1 - .../firebase_core_shared/FLTFirebasePlugin.m | 1 - .../FLTFirebasePluginRegistry.m | 1 - .../include/FLTFirebaseCorePlugin.h | 1 - .../include/FLTFirebasePlugin.h | 1 - .../include/FLTFirebasePluginRegistry.h | 1 - .../firebase_core_shared/include/messages.g.h | 1 - Sources/firebase_core_shared/messages.g.m | 1 - .../macos/firebase_core/Package.swift | 27 +++---------------- .../firebase_core/FLTFirebaseCorePlugin.m | 1 - .../firebase_core/FLTFirebaseCorePlugin.swift | 1 + .../Sources/firebase_core/FLTFirebasePlugin.m | 1 - .../firebase_core/FLTFirebasePlugin.swift | 1 + .../firebase_core/FLTFirebasePluginRegistry.m | 1 - .../FLTFirebasePluginRegistry.swift | 1 + .../firebase_core/FLTFirebaseCorePlugin.h | 1 - .../include/firebase_core/FLTFirebasePlugin.h | 1 - .../firebase_core/FLTFirebasePluginRegistry.h | 1 - .../include/firebase_core/messages.g.h | 1 - .../Sources/firebase_core/messages.g.m | 1 - .../Sources/firebase_core/messages.g.swift | 1 + 22 files changed, 13 insertions(+), 48 deletions(-) delete mode 120000 Sources/firebase_core_shared/FLTFirebaseCorePlugin.m delete mode 120000 Sources/firebase_core_shared/FLTFirebasePlugin.m delete mode 120000 Sources/firebase_core_shared/FLTFirebasePluginRegistry.m delete mode 120000 Sources/firebase_core_shared/include/FLTFirebaseCorePlugin.h delete mode 120000 Sources/firebase_core_shared/include/FLTFirebasePlugin.h delete mode 120000 Sources/firebase_core_shared/include/FLTFirebasePluginRegistry.h delete mode 120000 Sources/firebase_core_shared/include/messages.g.h delete mode 120000 Sources/firebase_core_shared/messages.g.m delete mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m create mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift delete mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m create mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift delete mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m create mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift delete mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h delete mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h delete mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h delete mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h delete mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/messages.g.m create mode 120000 packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/messages.g.swift diff --git a/Package.swift b/Package.swift index 15cbae486048..583a6382c30e 100644 --- a/Package.swift +++ b/Package.swift @@ -20,7 +20,7 @@ let package = Package( .macOS("10.15"), ], products: [ - .library(name: "firebase-core-shared", targets: ["firebase_core_shared"]), + .library(name: "firebase-core-shared", targets: ["firebase_core"]), ], dependencies: [ // TODO: this is fine for now, but will require a way of retrieving the firebase-ios-sdk @@ -32,16 +32,14 @@ let package = Package( ], targets: [ .target( - name: "firebase_core_shared", + name: "firebase_core", dependencies: [ .product(name: "FirebaseInstallations", package: "firebase-ios-sdk"), ], - path: "Sources/firebase_core_shared", - publicHeadersPath: "include", - cSettings: [ - .headerSearchPath("include/firebase_core"), - .define("LIBRARY_VERSION", to: "\"\(firebase_core_version)\""), - .define("LIBRARY_NAME", to: "\"flutter-fire-core\""), + path: "packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core", + swiftSettings: [ + .define("LIBRARY_VERSION", to: firebase_core_version), + .define("LIBRARY_NAME", to: "flutter-fire-core"), ] ), ] diff --git a/Sources/firebase_core_shared/FLTFirebaseCorePlugin.m b/Sources/firebase_core_shared/FLTFirebaseCorePlugin.m deleted file mode 120000 index e94afa3aad20..000000000000 --- a/Sources/firebase_core_shared/FLTFirebaseCorePlugin.m +++ /dev/null @@ -1 +0,0 @@ -../../packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m \ No newline at end of file diff --git a/Sources/firebase_core_shared/FLTFirebasePlugin.m b/Sources/firebase_core_shared/FLTFirebasePlugin.m deleted file mode 120000 index 76c49e1d4542..000000000000 --- a/Sources/firebase_core_shared/FLTFirebasePlugin.m +++ /dev/null @@ -1 +0,0 @@ -../../packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m \ No newline at end of file diff --git a/Sources/firebase_core_shared/FLTFirebasePluginRegistry.m b/Sources/firebase_core_shared/FLTFirebasePluginRegistry.m deleted file mode 120000 index be294affaf60..000000000000 --- a/Sources/firebase_core_shared/FLTFirebasePluginRegistry.m +++ /dev/null @@ -1 +0,0 @@ -../../packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m \ No newline at end of file diff --git a/Sources/firebase_core_shared/include/FLTFirebaseCorePlugin.h b/Sources/firebase_core_shared/include/FLTFirebaseCorePlugin.h deleted file mode 120000 index 8e3a8c248b88..000000000000 --- a/Sources/firebase_core_shared/include/FLTFirebaseCorePlugin.h +++ /dev/null @@ -1 +0,0 @@ -../../../packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h \ No newline at end of file diff --git a/Sources/firebase_core_shared/include/FLTFirebasePlugin.h b/Sources/firebase_core_shared/include/FLTFirebasePlugin.h deleted file mode 120000 index 6bbe0e68429a..000000000000 --- a/Sources/firebase_core_shared/include/FLTFirebasePlugin.h +++ /dev/null @@ -1 +0,0 @@ -../../../packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h \ No newline at end of file diff --git a/Sources/firebase_core_shared/include/FLTFirebasePluginRegistry.h b/Sources/firebase_core_shared/include/FLTFirebasePluginRegistry.h deleted file mode 120000 index e0b26a14c24f..000000000000 --- a/Sources/firebase_core_shared/include/FLTFirebasePluginRegistry.h +++ /dev/null @@ -1 +0,0 @@ -../../../packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h \ No newline at end of file diff --git a/Sources/firebase_core_shared/include/messages.g.h b/Sources/firebase_core_shared/include/messages.g.h deleted file mode 120000 index 3a5ff91b8660..000000000000 --- a/Sources/firebase_core_shared/include/messages.g.h +++ /dev/null @@ -1 +0,0 @@ -../../../packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h \ No newline at end of file diff --git a/Sources/firebase_core_shared/messages.g.m b/Sources/firebase_core_shared/messages.g.m deleted file mode 120000 index 9b2e6e36e348..000000000000 --- a/Sources/firebase_core_shared/messages.g.m +++ /dev/null @@ -1 +0,0 @@ -../../packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/messages.g.m \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift b/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift index 72866c18e400..d14ae3e81d3a 100644 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift +++ b/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift @@ -70,7 +70,6 @@ func loadFirebaseSDKVersion() throws -> String { let library_version_string: String let firebase_sdk_version_string: String -let shared_spm_tag = "-firebase-core-swift" do { library_version_string = try loadPubspecVersion() @@ -83,12 +82,6 @@ guard let firebase_sdk_version = Version(firebase_sdk_version_string) else { fatalError("Invalid Firebase SDK version: \(firebase_sdk_version_string)") } -// TODO: - we can try using existing firebase_core tag once flutterfire/Package.swift is part of release cycle -// but I don't think it'll work as Swift versioning requires version-[tag name] -guard let shared_spm_version = Version("\(library_version_string)\(shared_spm_tag)") else { - fatalError("Invalid firebase_core version: \(library_version_string)\(shared_spm_tag)") -} - let package = Package( name: "firebase_core", platforms: [ @@ -99,7 +92,6 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/firebase/firebase-ios-sdk", from: firebase_sdk_version), - .package(url: "https://github.com/firebase/flutterfire", exact: shared_spm_version), ], targets: [ .target( @@ -107,26 +99,13 @@ let package = Package( dependencies: [ // No product for firebase-core so we pull in the smallest one .product(name: "FirebaseInstallations", package: "firebase-ios-sdk"), - .product(name: "firebase-core-shared", package: "flutterfire"), - ], - exclude: [ - // These are now pulled in as a remote dependency from FlutterFire repo - "FLTFirebaseCorePlugin.m", - "FLTFirebasePlugin.m", - "FLTFirebasePluginRegistry.m", - "messages.g.m", - "include/firebase_core/FLTFirebaseCorePlugin.h", - "include/firebase_core/messages.g.h", - "include/firebase_core/FLTFirebasePlugin.h", - "include/firebase_core/FLTFirebasePluginRegistry.h", ], resources: [ .process("Resources"), ], - cSettings: [ - .headerSearchPath("include/firebase_core"), - .define("LIBRARY_VERSION", to: "\"\(library_version_string)\""), - .define("LIBRARY_NAME", to: "\"flutter-fire-core\""), + swiftSettings: [ + .define("LIBRARY_VERSION", to: library_version_string), + .define("LIBRARY_NAME", to: "flutter-fire-core"), ] ), ] diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m deleted file mode 120000 index d014e98d510f..000000000000 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m +++ /dev/null @@ -1 +0,0 @@ -../../../../ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift new file mode 120000 index 000000000000..ecb9b8b96d5f --- /dev/null +++ b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift @@ -0,0 +1 @@ +../../../../ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m deleted file mode 120000 index e6ce8910e33c..000000000000 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m +++ /dev/null @@ -1 +0,0 @@ -../../../../ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift new file mode 120000 index 000000000000..ff5477e8d0fe --- /dev/null +++ b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift @@ -0,0 +1 @@ +../../../../ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.swift \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m deleted file mode 120000 index 9c70b9506434..000000000000 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m +++ /dev/null @@ -1 +0,0 @@ -../../../../ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift new file mode 120000 index 000000000000..13e9c229c8cb --- /dev/null +++ b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift @@ -0,0 +1 @@ +../../../../ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.swift \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h deleted file mode 120000 index b8c28eb5bd36..000000000000 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../../ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h deleted file mode 120000 index 18a8349f94be..000000000000 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../../ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h deleted file mode 120000 index 17ebeb905b75..000000000000 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../../ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h deleted file mode 120000 index 77dd32416d53..000000000000 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../../ios/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/messages.g.m b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/messages.g.m deleted file mode 120000 index 8c67a9cfd102..000000000000 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/messages.g.m +++ /dev/null @@ -1 +0,0 @@ -../../../../ios/firebase_core/Sources/firebase_core/messages.g.m \ No newline at end of file diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/messages.g.swift b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/messages.g.swift new file mode 120000 index 000000000000..a5d828734f88 --- /dev/null +++ b/packages/firebase_core/firebase_core/macos/firebase_core/Sources/firebase_core/messages.g.swift @@ -0,0 +1 @@ +../../../../ios/firebase_core/Sources/firebase_core/messages.g.swift \ No newline at end of file From f68ed141dff996d76a19530ed1ca735067e9c8a8 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Wed, 5 Nov 2025 09:48:26 +0000 Subject: [PATCH 12/17] fix: package.swift consistency --- .../ios/firebase_core/Package.swift | 27 +++---------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Package.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Package.swift index 33f81b0a0e7d..b434fe7393b1 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Package.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Package.swift @@ -68,7 +68,6 @@ func loadFirebaseSDKVersion() throws -> String { let library_version_string: String let firebase_sdk_version_string: String -let shared_spm_tag = "-firebase-core-swift" do { library_version_string = try loadPubspecVersion() @@ -81,12 +80,6 @@ guard let firebase_sdk_version = Version(firebase_sdk_version_string) else { fatalError("Invalid Firebase SDK version: \(firebase_sdk_version_string)") } -// TODO: - we can try using existing firebase_core tag once flutterfire/Package.swift is part of release cycle -// but I don't think it'll work as Swift versioning requires version-[tag name] -guard let shared_spm_version = Version("\(library_version_string)\(shared_spm_tag)") else { - fatalError("Invalid firebase_core version: \(library_version_string)\(shared_spm_tag)") -} - let package = Package( name: "firebase_core", platforms: [ @@ -97,7 +90,6 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/firebase/firebase-ios-sdk", from: firebase_sdk_version), - .package(url: "https://github.com/firebase/flutterfire", exact: shared_spm_version), ], targets: [ .target( @@ -105,26 +97,13 @@ let package = Package( dependencies: [ // No product for firebase-core so we pull in the smallest one .product(name: "FirebaseInstallations", package: "firebase-ios-sdk"), - .product(name: "firebase-core-shared", package: "flutterfire"), - ], - exclude: [ - // These are now pulled in as a remote dependency from FlutterFire repo - "FLTFirebaseCorePlugin.m", - "FLTFirebasePlugin.m", - "FLTFirebasePluginRegistry.m", - "messages.g.m", - "include/firebase_core/FLTFirebaseCorePlugin.h", - "include/firebase_core/messages.g.h", - "include/firebase_core/FLTFirebasePlugin.h", - "include/firebase_core/FLTFirebasePluginRegistry.h", ], resources: [ .process("Resources"), ], - cSettings: [ - .headerSearchPath("include/firebase_core"), - .define("LIBRARY_VERSION", to: "\"\(library_version_string)\""), - .define("LIBRARY_NAME", to: "\"flutter-fire-core\""), + swiftSettings: [ + .define("LIBRARY_VERSION", to: library_version_string), + .define("LIBRARY_NAME", to: "flutter-fire-core"), ] ), ] From 8165facd6c4938e3b57c29c6b78b8ce9260ae3d1 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Wed, 5 Nov 2025 11:31:04 +0000 Subject: [PATCH 13/17] fix: firestore references and macos plugin --- .../cloud_firestore/FLTDocumentSnapshotStreamHandler.m | 6 +----- .../Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m | 6 +----- .../Sources/cloud_firestore/FLTLoadBundleStreamHandler.m | 6 +----- .../cloud_firestore/FLTQuerySnapshotStreamHandler.m | 6 +----- .../cloud_firestore/FLTTransactionStreamHandler.m | 6 +----- .../Sources/firebase_core/FLTFirebaseCorePlugin.swift | 9 ++++++--- .../FirebaseInAppMessagingPlugin.m | 7 +------ 7 files changed, 12 insertions(+), 34 deletions(-) diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m index ac679cc3e568..17d6792186e9 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m @@ -3,11 +3,7 @@ // found in the LICENSE file. @import FirebaseFirestore; -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; #import "include/cloud_firestore/Private/FLTDocumentSnapshotStreamHandler.h" #import "include/cloud_firestore/Private/FLTFirebaseFirestoreUtils.h" diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m index 44b0f40904fa..93683913193a 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m @@ -3,11 +3,7 @@ // found in the LICENSE file. @import FirebaseFirestore; -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; #import #import "FirebaseFirestoreInternal/FIRPersistentCacheIndexManager.h" diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m index 08629bb8926a..5215dc82ebe9 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m @@ -10,11 +10,7 @@ // @import FirebaseFirestore; -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; #import "include/cloud_firestore/Private/FLTFirebaseFirestoreUtils.h" #import "include/cloud_firestore/Private/FLTLoadBundleStreamHandler.h" diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m index e66b1eb86bfa..468b4c5615aa 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m @@ -3,11 +3,7 @@ // found in the LICENSE file. @import FirebaseFirestore; -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; #import "include/cloud_firestore/Private/FLTFirebaseFirestoreUtils.h" #import "include/cloud_firestore/Private/FLTQuerySnapshotStreamHandler.h" diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTTransactionStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTTransactionStreamHandler.m index 29252ca4821c..66280fe75d61 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTTransactionStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTTransactionStreamHandler.m @@ -3,11 +3,7 @@ // found in the LICENSE file. @import FirebaseFirestore; -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; #import "include/cloud_firestore/Private/FLTFirebaseFirestoreUtils.h" #import "include/cloud_firestore/Private/FLTTransactionStreamHandler.h" diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift index 3dbfcf7b2e68..84d92bacaa26 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.swift @@ -20,11 +20,14 @@ import Foundation @objc public static func register(with registrar: FlutterPluginRegistrar) { let instance = sharedInstance() - #if !os(macOS) + #if os(macOS) + let messenger = registrar.messenger + #else registrar.publish(instance) + let messenger = registrar.messenger() #endif - FirebaseCoreHostApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) - FirebaseAppHostApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) + FirebaseCoreHostApiSetup.setUp(binaryMessenger: messenger, api: instance) + FirebaseAppHostApiSetup.setUp(binaryMessenger: messenger, api: instance) } // Returns a singleton instance of the Firebase Core plugin. diff --git a/packages/firebase_in_app_messaging/firebase_in_app_messaging/ios/firebase_in_app_messaging/Sources/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.m b/packages/firebase_in_app_messaging/firebase_in_app_messaging/ios/firebase_in_app_messaging/Sources/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.m index 64519a1ca9db..de53d4bdfbea 100644 --- a/packages/firebase_in_app_messaging/firebase_in_app_messaging/ios/firebase_in_app_messaging/Sources/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.m +++ b/packages/firebase_in_app_messaging/firebase_in_app_messaging/ios/firebase_in_app_messaging/Sources/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.m @@ -5,12 +5,7 @@ #import "FirebaseInAppMessagingPlugin.h" @import FirebaseInAppMessaging; - -#if __has_include() -#import -#else -#import -#endif +@import firebase_core; NSString *const kFLTFirebaseInAppMessagingChannelName = @"plugins.flutter.io/firebase_in_app_messaging"; From 51fa0a31cb3c5a3a40ba2f1638586c9b85c66016 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Wed, 5 Nov 2025 11:44:08 +0000 Subject: [PATCH 14/17] fix: ios firestore refs --- Package.swift | 6 +----- .../cloud_firestore/FLTDocumentSnapshotStreamHandler.m | 2 +- .../Sources/cloud_firestore/FLTFirebaseFirestoreWriter.m | 4 +++- .../Sources/cloud_firestore/FLTLoadBundleStreamHandler.m | 2 +- .../Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m | 2 +- .../Sources/cloud_firestore/FLTTransactionStreamHandler.m | 6 ++++-- .../firebase_core/ios/firebase_core/Package.swift | 4 ---- .../firebase_core/macos/firebase_core/Package.swift | 4 ---- 8 files changed, 11 insertions(+), 19 deletions(-) diff --git a/Package.swift b/Package.swift index 583a6382c30e..ee9088df159f 100644 --- a/Package.swift +++ b/Package.swift @@ -36,11 +36,7 @@ let package = Package( dependencies: [ .product(name: "FirebaseInstallations", package: "firebase-ios-sdk"), ], - path: "packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core", - swiftSettings: [ - .define("LIBRARY_VERSION", to: firebase_core_version), - .define("LIBRARY_NAME", to: "flutter-fire-core"), - ] + path: "packages/firebase_core/firebase_core/ios/firebase_core/Sources/firebase_core" ), ] ) diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m index 17d6792186e9..386a86f4bdd3 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTDocumentSnapshotStreamHandler.m @@ -47,7 +47,7 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments events([FLTFirebasePluginHelper createFlutterErrorWithCode:code message:message optionalDetails:details - andOptionalNSError:error]); + andOptionalError:error]); }); } else { dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreWriter.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreWriter.m index f2656d38dbc9..6d3308220c35 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreWriter.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreWriter.m @@ -4,6 +4,7 @@ @import FirebaseFirestore; @import FirebaseCore; +@import firebase_core; #import "include/cloud_firestore/Private/FLTFirebaseFirestoreWriter.h" #import "include/cloud_firestore/Private/FLTFirebaseFirestoreUtils.h" @@ -39,7 +40,8 @@ - (void)writeValue:(id)value { } else if ([value isKindOfClass:[FIRDocumentReference class]]) { FIRDocumentReference *document = value; NSString *documentPath = [document path]; - NSString *appName = [FLTFirebasePlugin firebaseAppNameFromIosName:document.firestore.app.name]; + NSString *appName = + [FLTFirebasePluginHelper firebaseAppNameFromIosName:document.firestore.app.name]; [self writeByte:FirestoreDataTypeDocumentReference]; [self writeValue:appName]; [self writeValue:documentPath]; diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m index 5215dc82ebe9..2c40b70deb92 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTLoadBundleStreamHandler.m @@ -51,7 +51,7 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments events([FLTFirebasePluginHelper createFlutterErrorWithCode:code message:message optionalDetails:details - andOptionalNSError:error]); + andOptionalError:error]); }); } }]; diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m index 468b4c5615aa..b3700059e3bf 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTQuerySnapshotStreamHandler.m @@ -57,7 +57,7 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments events([FLTFirebasePluginHelper createFlutterErrorWithCode:code message:message optionalDetails:details - andOptionalNSError:error]); + andOptionalError:error]); }); } else { dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTTransactionStreamHandler.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTTransactionStreamHandler.m index 66280fe75d61..9284ff4f287d 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTTransactionStreamHandler.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTTransactionStreamHandler.m @@ -4,6 +4,7 @@ @import FirebaseFirestore; @import firebase_core; +@import FirebaseCore; #import "include/cloud_firestore/Private/FLTFirebaseFirestoreUtils.h" #import "include/cloud_firestore/Private/FLTTransactionStreamHandler.h" @@ -51,8 +52,9 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments strongSelf.started(transaction); dispatch_async(dispatch_get_main_queue(), ^{ - events( - @{@"appName" : [FLTFirebasePlugin firebaseAppNameFromIosName:self.firestore.app.name]}); + events(@{ + @"appName" : [FLTFirebasePluginHelper firebaseAppNameFromIosName:self.firestore.app.name] + }); }); long timedOut = dispatch_semaphore_wait( diff --git a/packages/firebase_core/firebase_core/ios/firebase_core/Package.swift b/packages/firebase_core/firebase_core/ios/firebase_core/Package.swift index b434fe7393b1..9e422bf4d7d4 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_core/Package.swift +++ b/packages/firebase_core/firebase_core/ios/firebase_core/Package.swift @@ -100,10 +100,6 @@ let package = Package( ], resources: [ .process("Resources"), - ], - swiftSettings: [ - .define("LIBRARY_VERSION", to: library_version_string), - .define("LIBRARY_NAME", to: "flutter-fire-core"), ] ), ] diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift b/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift index d14ae3e81d3a..789ff35a61ce 100644 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift +++ b/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift @@ -102,10 +102,6 @@ let package = Package( ], resources: [ .process("Resources"), - ], - swiftSettings: [ - .define("LIBRARY_VERSION", to: library_version_string), - .define("LIBRARY_NAME", to: "flutter-fire-core"), ] ), ] From 49c9cb9f0eb8029cefb154e9bec0eaf8d2352a46 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Wed, 5 Nov 2025 11:57:06 +0000 Subject: [PATCH 15/17] fix: ios firestore def --- .../Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m index 93683913193a..2e5071acdd5a 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestorePlugin.m @@ -4,6 +4,7 @@ @import FirebaseFirestore; @import firebase_core; +@import FirebaseCore; #import #import "FirebaseFirestoreInternal/FIRPersistentCacheIndexManager.h" From e02517346e8aed9065f2d102ea5e6de9823ef8bb Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Thu, 6 Nov 2025 11:12:36 +0000 Subject: [PATCH 16/17] fix: swift integration duplication error --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index ee9088df159f..a6f8b1e590bd 100644 --- a/Package.swift +++ b/Package.swift @@ -20,7 +20,7 @@ let package = Package( .macOS("10.15"), ], products: [ - .library(name: "firebase-core-shared", targets: ["firebase_core"]), + .library(name: "firebase-core-shared", targets: ["firebase_core_shared"]), ], dependencies: [ // TODO: this is fine for now, but will require a way of retrieving the firebase-ios-sdk @@ -32,7 +32,7 @@ let package = Package( ], targets: [ .target( - name: "firebase_core", + name: "firebase_core_shared", dependencies: [ .product(name: "FirebaseInstallations", package: "firebase-ios-sdk"), ], From b495f7a0b833b65e86dfce509aec96b5f86e5eb7 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Fri, 7 Nov 2025 10:10:57 +0000 Subject: [PATCH 17/17] fix: package.swift --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index a6f8b1e590bd..ee9088df159f 100644 --- a/Package.swift +++ b/Package.swift @@ -20,7 +20,7 @@ let package = Package( .macOS("10.15"), ], products: [ - .library(name: "firebase-core-shared", targets: ["firebase_core_shared"]), + .library(name: "firebase-core-shared", targets: ["firebase_core"]), ], dependencies: [ // TODO: this is fine for now, but will require a way of retrieving the firebase-ios-sdk @@ -32,7 +32,7 @@ let package = Package( ], targets: [ .target( - name: "firebase_core_shared", + name: "firebase_core", dependencies: [ .product(name: "FirebaseInstallations", package: "firebase-ios-sdk"), ],