From 93c655b7f68f5ebdbeef17142ab4800001602d44 Mon Sep 17 00:00:00 2001 From: ehesp Date: Tue, 16 Nov 2021 10:30:29 +0000 Subject: [PATCH 01/51] chore: setup firebase_installations --- .../firebase_installations/.gitignore | 7 + .../firebase_installations/.metadata | 10 + .../firebase_installations/CHANGELOG.md | 3 + .../firebase_installations/LICENSE | 1 + .../firebase_installations/README.md | 15 + .../analysis_options.yaml | 4 + .../firebase_installations/android/.gitignore | 8 + .../android/build.gradle | 35 ++ .../android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../FirebaseInstallationsPlugin.java | 38 ++ .../firebase_installations/example/.gitignore | 46 ++ .../firebase_installations/example/.metadata | 10 + .../firebase_installations/example/README.md | 16 + .../example/analysis_options.yaml | 29 ++ .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 55 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 ++ .../MainActivity.java | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 27 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/ios/.gitignore | 34 ++ .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../ios/Runner.xcodeproj/project.pbxproj | 472 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.h | 6 + .../example/ios/Runner/AppDelegate.m | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 45 ++ .../example/ios/Runner/main.m | 9 + .../example/lib/main.dart | 62 +++ .../example/pubspec.yaml | 84 ++++ .../firebase_installations/ios/.gitignore | 38 ++ .../ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseInstallationsPlugin.h | 4 + .../ios/Classes/FirebaseInstallationsPlugin.m | 20 + .../ios/firebase_installations.podspec | 23 + .../lib/firebase_installations.dart | 13 + .../firebase_installations/pubspec.yaml | 65 +++ .../test/firebase_installations_test.dart | 23 + 85 files changed, 1761 insertions(+) create mode 100644 packages/firebase_installations/firebase_installations/.gitignore create mode 100644 packages/firebase_installations/firebase_installations/.metadata create mode 100644 packages/firebase_installations/firebase_installations/CHANGELOG.md create mode 100644 packages/firebase_installations/firebase_installations/LICENSE create mode 100644 packages/firebase_installations/firebase_installations/README.md create mode 100644 packages/firebase_installations/firebase_installations/analysis_options.yaml create mode 100644 packages/firebase_installations/firebase_installations/android/.gitignore create mode 100644 packages/firebase_installations/firebase_installations/android/build.gradle create mode 100644 packages/firebase_installations/firebase_installations/android/gradle.properties create mode 100644 packages/firebase_installations/firebase_installations/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 packages/firebase_installations/firebase_installations/android/settings.gradle create mode 100644 packages/firebase_installations/firebase_installations/android/src/main/AndroidManifest.xml create mode 100644 packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java create mode 100644 packages/firebase_installations/firebase_installations/example/.gitignore create mode 100644 packages/firebase_installations/firebase_installations/example/.metadata create mode 100644 packages/firebase_installations/firebase_installations/example/README.md create mode 100644 packages/firebase_installations/firebase_installations/example/analysis_options.yaml create mode 100644 packages/firebase_installations/firebase_installations/example/android/.gitignore create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/build.gradle create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/debug/AndroidManifest.xml create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/AndroidManifest.xml create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations_example/MainActivity.java create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/res/values-night/styles.xml create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/res/values/styles.xml create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/profile/AndroidManifest.xml create mode 100644 packages/firebase_installations/firebase_installations/example/android/build.gradle create mode 100644 packages/firebase_installations/firebase_installations/example/android/gradle.properties create mode 100644 packages/firebase_installations/firebase_installations/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 packages/firebase_installations/firebase_installations/example/android/settings.gradle create mode 100644 packages/firebase_installations/firebase_installations/example/ios/.gitignore create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Flutter/Debug.xcconfig create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Flutter/Release.xcconfig create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.h create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.m create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/main.m create mode 100644 packages/firebase_installations/firebase_installations/example/lib/main.dart create mode 100644 packages/firebase_installations/firebase_installations/example/pubspec.yaml create mode 100644 packages/firebase_installations/firebase_installations/ios/.gitignore create mode 100644 packages/firebase_installations/firebase_installations/ios/Assets/.gitkeep create mode 100644 packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h create mode 100644 packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m create mode 100644 packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec create mode 100644 packages/firebase_installations/firebase_installations/lib/firebase_installations.dart create mode 100644 packages/firebase_installations/firebase_installations/pubspec.yaml create mode 100644 packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart diff --git a/packages/firebase_installations/firebase_installations/.gitignore b/packages/firebase_installations/firebase_installations/.gitignore new file mode 100644 index 000000000000..e9dc58d3d6e2 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ diff --git a/packages/firebase_installations/firebase_installations/.metadata b/packages/firebase_installations/firebase_installations/.metadata new file mode 100644 index 000000000000..5bed5265e818 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 18116933e77adc82f80866c928266a5b4f1ed645 + channel: stable + +project_type: plugin diff --git a/packages/firebase_installations/firebase_installations/CHANGELOG.md b/packages/firebase_installations/firebase_installations/CHANGELOG.md new file mode 100644 index 000000000000..41cc7d8192ec --- /dev/null +++ b/packages/firebase_installations/firebase_installations/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/firebase_installations/firebase_installations/LICENSE b/packages/firebase_installations/firebase_installations/LICENSE new file mode 100644 index 000000000000..ba75c69f7f21 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/firebase_installations/firebase_installations/README.md b/packages/firebase_installations/firebase_installations/README.md new file mode 100644 index 000000000000..0b4a9a7ffdfe --- /dev/null +++ b/packages/firebase_installations/firebase_installations/README.md @@ -0,0 +1,15 @@ +# firebase_installations + +A new flutter plugin project. + +## Getting Started + +This project is a starting point for a Flutter +[plug-in package](https://flutter.dev/developing-packages/), +a specialized package that includes platform-specific implementation code for +Android and/or iOS. + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. + diff --git a/packages/firebase_installations/firebase_installations/analysis_options.yaml b/packages/firebase_installations/firebase_installations/analysis_options.yaml new file mode 100644 index 000000000000..a5744c1cfbe7 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/firebase_installations/firebase_installations/android/.gitignore b/packages/firebase_installations/firebase_installations/android/.gitignore new file mode 100644 index 000000000000..c6cbe562a427 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/packages/firebase_installations/firebase_installations/android/build.gradle b/packages/firebase_installations/firebase_installations/android/build.gradle new file mode 100644 index 000000000000..e3af2e472f55 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/build.gradle @@ -0,0 +1,35 @@ +group 'io.flutter.plugins.firebase.installations.firebase_installations' +version '1.0' + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + minSdkVersion 16 + } +} diff --git a/packages/firebase_installations/firebase_installations/android/gradle.properties b/packages/firebase_installations/firebase_installations/android/gradle.properties new file mode 100644 index 000000000000..94adc3a3f97a --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/firebase_installations/firebase_installations/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_installations/firebase_installations/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..3c9d0852bfa5 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/packages/firebase_installations/firebase_installations/android/settings.gradle b/packages/firebase_installations/firebase_installations/android/settings.gradle new file mode 100644 index 000000000000..18b9c62dc781 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'firebase_installations' diff --git a/packages/firebase_installations/firebase_installations/android/src/main/AndroidManifest.xml b/packages/firebase_installations/firebase_installations/android/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..e4a70c21d7f5 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java new file mode 100644 index 000000000000..dfd3dc45b817 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java @@ -0,0 +1,38 @@ +package io.flutter.plugins.firebase.installations.firebase_installations; + +import androidx.annotation.NonNull; + +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; + +/** FirebaseInstallationsPlugin */ +public class FirebaseInstallationsPlugin implements FlutterPlugin, MethodCallHandler { + /// The MethodChannel that will the communication between Flutter and native Android + /// + /// This local reference serves to register the plugin with the Flutter Engine and unregister it + /// when the Flutter Engine is detached from the Activity + private MethodChannel channel; + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { + channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "firebase_installations"); + channel.setMethodCallHandler(this); + } + + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { + if (call.method.equals("getPlatformVersion")) { + result.success("Android " + android.os.Build.VERSION.RELEASE); + } else { + result.notImplemented(); + } + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + channel.setMethodCallHandler(null); + } +} diff --git a/packages/firebase_installations/firebase_installations/example/.gitignore b/packages/firebase_installations/firebase_installations/example/.gitignore new file mode 100644 index 000000000000..0fa6b675c0a5 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/packages/firebase_installations/firebase_installations/example/.metadata b/packages/firebase_installations/firebase_installations/example/.metadata new file mode 100644 index 000000000000..a5584fc372d9 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 18116933e77adc82f80866c928266a5b4f1ed645 + channel: stable + +project_type: app diff --git a/packages/firebase_installations/firebase_installations/example/README.md b/packages/firebase_installations/firebase_installations/example/README.md new file mode 100644 index 000000000000..585edf015576 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/README.md @@ -0,0 +1,16 @@ +# firebase_installations_example + +Demonstrates how to use the firebase_installations plugin. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/packages/firebase_installations/firebase_installations/example/analysis_options.yaml b/packages/firebase_installations/firebase_installations/example/analysis_options.yaml new file mode 100644 index 000000000000..61b6c4de17c9 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/firebase_installations/firebase_installations/example/android/.gitignore b/packages/firebase_installations/firebase_installations/example/android/.gitignore new file mode 100644 index 000000000000..6f568019d3c6 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/packages/firebase_installations/firebase_installations/example/android/app/build.gradle b/packages/firebase_installations/firebase_installations/example/android/app/build.gradle new file mode 100644 index 000000000000..348c56c09039 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/build.gradle @@ -0,0 +1,55 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "io.flutter.plugins.firebase.installations.firebase_installations_example" + minSdkVersion 16 + targetSdkVersion 30 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/debug/AndroidManifest.xml b/packages/firebase_installations/firebase_installations/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000000..d13fb56ad4ff --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_installations/firebase_installations/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..f67de2925191 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations_example/MainActivity.java b/packages/firebase_installations/firebase_installations/example/android/app/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations_example/MainActivity.java new file mode 100644 index 000000000000..edcb4683b12f --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations_example/MainActivity.java @@ -0,0 +1,6 @@ +package io.flutter.plugins.firebase.installations.firebase_installations_example; + +import io.flutter.embedding.android.FlutterActivity; + +public class MainActivity extends FlutterActivity { +} diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000000..f74085f3f6a2 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/drawable/launch_background.xml b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000000..304732f88420 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/values-night/styles.xml b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 000000000000..449a9f930826 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/values/styles.xml b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000000..d74aa35c2826 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/profile/AndroidManifest.xml b/packages/firebase_installations/firebase_installations/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000000..d13fb56ad4ff --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/firebase_installations/firebase_installations/example/android/build.gradle b/packages/firebase_installations/firebase_installations/example/android/build.gradle new file mode 100644 index 000000000000..622ddc5c15ef --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/build.gradle @@ -0,0 +1,27 @@ +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/packages/firebase_installations/firebase_installations/example/android/gradle.properties b/packages/firebase_installations/firebase_installations/example/android/gradle.properties new file mode 100644 index 000000000000..94adc3a3f97a --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/firebase_installations/firebase_installations/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_installations/firebase_installations/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..bc6a58afdda2 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/packages/firebase_installations/firebase_installations/example/android/settings.gradle b/packages/firebase_installations/firebase_installations/example/android/settings.gradle new file mode 100644 index 000000000000..44e62bcf06ae --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/packages/firebase_installations/firebase_installations/example/ios/.gitignore b/packages/firebase_installations/firebase_installations/example/ios/.gitignore new file mode 100644 index 000000000000..7a7f9873ad7d --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_installations/firebase_installations/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000000..8d4492f977ad --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 9.0 + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Flutter/Debug.xcconfig b/packages/firebase_installations/firebase_installations/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000000..ec97fc6f3021 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/packages/firebase_installations/firebase_installations/example/ios/Flutter/Release.xcconfig b/packages/firebase_installations/firebase_installations/example/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000000..c4855bfe2000 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..dfa033066a88 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,472 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.installations.firebaseInstallationsExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.installations.firebaseInstallationsExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.installations.firebaseInstallationsExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000000..919434a6254f --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000000..18d981003d68 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000000..f9b0d7c5ea15 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000000..a28140cfdb3f --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000000..1d526a16ed0f --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000000..18d981003d68 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000000..f9b0d7c5ea15 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.h b/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.h new file mode 100644 index 000000000000..36e21bbf9cf4 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.m b/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.m new file mode 100644 index 000000000000..70e83933db14 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#import "AppDelegate.h" +#import "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000000..d36b1fab2d9d --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000000..89c2725b70f1 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/firebase_installations/firebase_installations/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000000..f2e259c7c939 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_installations/firebase_installations/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000000..f3c28516fb38 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist b/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist new file mode 100644 index 000000000000..3ee5f2138549 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + firebase_installations_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/main.m b/packages/firebase_installations/firebase_installations/example/ios/Runner/main.m new file mode 100644 index 000000000000..dff6597e4513 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart new file mode 100644 index 000000000000..a4d22a9aa2d8 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'dart:async'; + +import 'package:flutter/services.dart'; +import 'package:firebase_installations/firebase_installations.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatefulWidget { + const MyApp({Key? key}) : super(key: key); + + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State { + String _platformVersion = 'Unknown'; + + @override + void initState() { + super.initState(); + initPlatformState(); + } + + // Platform messages are asynchronous, so we initialize in an async method. + Future initPlatformState() async { + String platformVersion; + // Platform messages may fail, so we use a try/catch PlatformException. + // We also handle the message potentially returning null. + try { + platformVersion = + await FirebaseInstallations.platformVersion ?? 'Unknown platform version'; + } on PlatformException { + platformVersion = 'Failed to get platform version.'; + } + + // If the widget was removed from the tree while the asynchronous platform + // message was in flight, we want to discard the reply rather than calling + // setState to update our non-existent appearance. + if (!mounted) return; + + setState(() { + _platformVersion = platformVersion; + }); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: Center( + child: Text('Running on: $_platformVersion\n'), + ), + ), + ); + } +} diff --git a/packages/firebase_installations/firebase_installations/example/pubspec.yaml b/packages/firebase_installations/firebase_installations/example/pubspec.yaml new file mode 100644 index 000000000000..cca9e205effa --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/pubspec.yaml @@ -0,0 +1,84 @@ +name: firebase_installations_example +description: Demonstrates how to use the firebase_installations plugin. + +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +environment: + sdk: ">=2.12.0 <3.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + firebase_installations: + # When depending on this package from a real application you should use: + # firebase_installations: ^x.y.z + # See https://dart.dev/tools/pub/dependencies#version-constraints + # The example app is bundled with the plugin so we use a path dependency on + # the parent directory to use the current plugin's version. + path: ../ + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^1.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/firebase_installations/firebase_installations/ios/.gitignore b/packages/firebase_installations/firebase_installations/ios/.gitignore new file mode 100644 index 000000000000..0c885071e36b --- /dev/null +++ b/packages/firebase_installations/firebase_installations/ios/.gitignore @@ -0,0 +1,38 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m + +.generated/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/Generated.xcconfig +/Flutter/ephemeral/ +/Flutter/flutter_export_environment.sh \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/ios/Assets/.gitkeep b/packages/firebase_installations/firebase_installations/ios/Assets/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h new file mode 100644 index 000000000000..1ee58326f2e1 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h @@ -0,0 +1,4 @@ +#import + +@interface FirebaseInstallationsPlugin : NSObject +@end diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m new file mode 100644 index 000000000000..301ec8e3dd0d --- /dev/null +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m @@ -0,0 +1,20 @@ +#import "FirebaseInstallationsPlugin.h" + +@implementation FirebaseInstallationsPlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + FlutterMethodChannel* channel = [FlutterMethodChannel + methodChannelWithName:@"firebase_installations" + binaryMessenger:[registrar messenger]]; + FirebaseInstallationsPlugin* instance = [[FirebaseInstallationsPlugin alloc] init]; + [registrar addMethodCallDelegate:instance channel:channel]; +} + +- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { + if ([@"getPlatformVersion" isEqualToString:call.method]) { + result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]); + } else { + result(FlutterMethodNotImplemented); + } +} + +@end diff --git a/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec b/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec new file mode 100644 index 000000000000..b9a65fd0fe32 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec @@ -0,0 +1,23 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint firebase_installations.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'firebase_installations' + s.version = '0.0.1' + s.summary = 'A new flutter plugin project.' + s.description = <<-DESC +A new flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + s.platform = :ios, '8.0' + + # Flutter.framework does not contain a i386 slice. + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } +end diff --git a/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart b/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart new file mode 100644 index 000000000000..4756d869c673 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart @@ -0,0 +1,13 @@ + +import 'dart:async'; + +import 'package:flutter/services.dart'; + +class FirebaseInstallations { + static const MethodChannel _channel = MethodChannel('firebase_installations'); + + static Future get platformVersion async { + final String? version = await _channel.invokeMethod('getPlatformVersion'); + return version; + } +} diff --git a/packages/firebase_installations/firebase_installations/pubspec.yaml b/packages/firebase_installations/firebase_installations/pubspec.yaml new file mode 100644 index 000000000000..325b63c661c6 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/pubspec.yaml @@ -0,0 +1,65 @@ +name: firebase_installations +description: A new flutter plugin project. +version: 0.0.1 +homepage: + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: ">=1.20.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + # This section identifies this Flutter project as a plugin project. + # The 'pluginClass' and Android 'package' identifiers should not ordinarily + # be modified. They are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + platforms: + android: + package: io.flutter.plugins.firebase.installations.firebase_installations + pluginClass: FirebaseInstallationsPlugin + ios: + pluginClass: FirebaseInstallationsPlugin + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart new file mode 100644 index 000000000000..2f652cf5ae97 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart @@ -0,0 +1,23 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:firebase_installations/firebase_installations.dart'; + +void main() { + const MethodChannel channel = MethodChannel('firebase_installations'); + + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + return '42'; + }); + }); + + tearDown(() { + channel.setMockMethodCallHandler(null); + }); + + test('getPlatformVersion', () async { + expect(await FirebaseInstallations.platformVersion, '42'); + }); +} From 69234eb4a8babda7b3866c22a06e4cb4957550cd Mon Sep 17 00:00:00 2001 From: ehesp Date: Tue, 16 Nov 2021 10:47:21 +0000 Subject: [PATCH 02/51] chore: firebase_installations class --- .../lib/firebase_installations.dart | 19 +++-- .../lib/src/firebase_installations.dart | 71 +++++++++++++++++++ .../firebase_installations/pubspec.yaml | 51 +++---------- 3 files changed, 89 insertions(+), 52 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart diff --git a/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart b/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart index 4756d869c673..7ccbbb21698a 100644 --- a/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart @@ -1,13 +1,12 @@ +// Copyright 2021, 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. -import 'dart:async'; +library firebase_installations; -import 'package:flutter/services.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart' + show FirebasePluginPlatform; +import 'package:flutter/foundation.dart'; -class FirebaseInstallations { - static const MethodChannel _channel = MethodChannel('firebase_installations'); - - static Future get platformVersion async { - final String? version = await _channel.invokeMethod('getPlatformVersion'); - return version; - } -} +part 'src/firebase_installations.dart'; diff --git a/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart b/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart new file mode 100644 index 000000000000..e0a6ed6d0bc0 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart @@ -0,0 +1,71 @@ +// 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. + +part of firebase_installations; + +class FirebaseInstallations extends FirebasePluginPlatform { + FirebaseInstallations._({required this.app}) + : super(app.name, 'plugins.flutter.io/firebase_installations'); + + // Cached and lazily loaded instance of [FirebaseInstallationsPlatform] to avoid + // creating a [MethodChannelFirebaseInstallations] when not needed or creating an + // instance with the default app before a user specifies an app. + FirebaseInstallationsPlatform? _delegatePackingProperty; + + /// Returns the underlying [FirebaseFunctionsPlatform] delegate for this + /// [FirebaseFunctions] instance. This is useful for testing purposes only. + FirebaseInstallationsPlatform get _delegate { + return _delegatePackingProperty ??= + FirebaseInstallationsPlatform.instanceFor(app: app); + } + + /// The [FirebaseApp] for this current [FirebaseInstallations] instance. + final FirebaseApp app; + + static final Map _cachedInstances = {}; + + /// Returns an instance using the default [FirebaseApp] and region. + static FirebaseInstallations get instance { + return FirebaseInstallations.instanceFor( + app: Firebase.app(), + ); + } + + /// Returns an instance using a specified [FirebaseApp] & region. + static FirebaseInstallations instanceFor({FirebaseApp? app, String? region}) { + app ??= Firebase.app(); + region ??= 'us-central1'; + String cachedKey = '${app.name}_$region'; + + if (_cachedInstances.containsKey(cachedKey)) { + return _cachedInstances[cachedKey]!; + } + + FirebaseInstallations newInstance = FirebaseInstallations._(app: app); + _cachedInstances[cachedKey] = newInstance; + + return newInstance; + } + + /// Deletes the Firebase Installation and all associated data. + Future delete() { + return _delegate.delete(); + } + + /// Creates a Firebase Installation if there isn't one for the app and + /// returns the Installation ID. + Future getId() { + return _delegate.getId(); + } + + /// Returns an Authentication Token for the current Firebase Installation. + Future getToken([bool forceRefresh = false]) { + return _delegate.getToken(forceRefresh); + } + + /// Sends a new event via a [Stream] whenever the Installation ID changes. + Stream onIdChange() { + return _delegate.onIdChange(); + } +} diff --git a/packages/firebase_installations/firebase_installations/pubspec.yaml b/packages/firebase_installations/firebase_installations/pubspec.yaml index 325b63c661c6..06320ea82b5d 100644 --- a/packages/firebase_installations/firebase_installations/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/pubspec.yaml @@ -1,30 +1,28 @@ name: firebase_installations -description: A new flutter plugin project. +description: A Flutter plugin allowing you to use Firebase Installations. version: 0.0.1 -homepage: +homepage: https://firebase.flutter.dev/docs/installations/overview +repository: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations environment: sdk: ">=2.12.0 <3.0.0" flutter: ">=1.20.0" dependencies: + firebase_core: ^1.10.0 + firebase_core_platform_interface: ^4.1.0 flutter: sdk: flutter dev_dependencies: + flutter_driver: + sdk: flutter flutter_test: sdk: flutter - flutter_lints: ^1.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec + plugin_platform_interface: ^2.0.0 + test: any -# The following section is specific to Flutter. flutter: - # This section identifies this Flutter project as a plugin project. - # The 'pluginClass' and Android 'package' identifiers should not ordinarily - # be modified. They are used by the tooling to maintain consistency when - # adding or updating assets for this project. plugin: platforms: android: @@ -32,34 +30,3 @@ flutter: pluginClass: FirebaseInstallationsPlugin ios: pluginClass: FirebaseInstallationsPlugin - - # To add assets to your plugin package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - - # To add custom fonts to your plugin package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages From 893b21a8381397e29a13ae6774cc3f04013b6241 Mon Sep 17 00:00:00 2001 From: ehesp Date: Tue, 16 Nov 2021 10:48:13 +0000 Subject: [PATCH 03/51] chore: setup firebase_installations_platform_interface --- .../.gitignore | 75 +++++++++++++++++++ .../.metadata | 10 +++ .../CHANGELOG.md | 3 + .../LICENSE | 1 + .../README.md | 39 ++++++++++ .../analysis_options.yaml | 4 + ...base_installations_platform_interface.dart | 7 ++ .../pubspec.yaml | 54 +++++++++++++ ...installations_platform_interface_test.dart | 12 +++ 9 files changed, 205 insertions(+) create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/.gitignore create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/.metadata create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/CHANGELOG.md create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/LICENSE create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/README.md create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/analysis_options.yaml create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/test/firebase_installations_platform_interface_test.dart diff --git a/packages/firebase_installations/firebase_installations_platform_interface/.gitignore b/packages/firebase_installations/firebase_installations_platform_interface/.gitignore new file mode 100644 index 000000000000..a247422ef7c3 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/.gitignore @@ -0,0 +1,75 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/ephemeral +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 diff --git a/packages/firebase_installations/firebase_installations_platform_interface/.metadata b/packages/firebase_installations/firebase_installations_platform_interface/.metadata new file mode 100644 index 000000000000..db56104b21ff --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 18116933e77adc82f80866c928266a5b4f1ed645 + channel: stable + +project_type: package diff --git a/packages/firebase_installations/firebase_installations_platform_interface/CHANGELOG.md b/packages/firebase_installations/firebase_installations_platform_interface/CHANGELOG.md new file mode 100644 index 000000000000..41cc7d8192ec --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/firebase_installations/firebase_installations_platform_interface/LICENSE b/packages/firebase_installations/firebase_installations_platform_interface/LICENSE new file mode 100644 index 000000000000..ba75c69f7f21 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/firebase_installations/firebase_installations_platform_interface/README.md b/packages/firebase_installations/firebase_installations_platform_interface/README.md new file mode 100644 index 000000000000..8b55e735b501 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/firebase_installations/firebase_installations_platform_interface/analysis_options.yaml b/packages/firebase_installations/firebase_installations_platform_interface/analysis_options.yaml new file mode 100644 index 000000000000..a5744c1cfbe7 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart new file mode 100644 index 000000000000..59ab3548f776 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart @@ -0,0 +1,7 @@ +library firebase_installations_platform_interface; + +/// A Calculator. +class Calculator { + /// Returns [value] plus 1. + int addOne(int value) => value + 1; +} diff --git a/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml b/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml new file mode 100644 index 000000000000..5af81d37750b --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml @@ -0,0 +1,54 @@ +name: firebase_installations_platform_interface +description: A new Flutter package project. +version: 0.0.1 +homepage: + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/firebase_installations/firebase_installations_platform_interface/test/firebase_installations_platform_interface_test.dart b/packages/firebase_installations/firebase_installations_platform_interface/test/firebase_installations_platform_interface_test.dart new file mode 100644 index 000000000000..fa82a2985c50 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/test/firebase_installations_platform_interface_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; + +void main() { + test('adds one to input values', () { + final calculator = Calculator(); + expect(calculator.addOne(2), 3); + expect(calculator.addOne(-7), -6); + expect(calculator.addOne(0), 1); + }); +} From 7056c8df993e868ba8361eec7d2eef4a29123ec0 Mon Sep 17 00:00:00 2001 From: ehesp Date: Tue, 16 Nov 2021 11:19:17 +0000 Subject: [PATCH 04/51] chore: firebase_installations_platform_interface logic --- .../lib/firebase_installations.dart | 1 + .../lib/src/firebase_installations.dart | 23 ++-- .../firebase_installations/pubspec.yaml | 1 + ...base_installations_platform_interface.dart | 10 +- ...method_channel_firebase_installations.dart | 107 ++++++++++++++++++ .../src/method_channel/utils/exception.dart | 44 +++++++ ...form_interface_firebase_installations.dart | 69 +++++++++++ .../pubspec.yaml | 46 ++------ 8 files changed, 241 insertions(+), 60 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/utils/exception.dart create mode 100644 packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/platform_interface_firebase_installations.dart diff --git a/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart b/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart index 7ccbbb21698a..586f76d36381 100644 --- a/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart @@ -7,6 +7,7 @@ library firebase_installations; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart' show FirebasePluginPlatform; +import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; import 'package:flutter/foundation.dart'; part 'src/firebase_installations.dart'; diff --git a/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart b/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart index e0a6ed6d0bc0..8d7abe936ba6 100644 --- a/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart @@ -32,20 +32,11 @@ class FirebaseInstallations extends FirebasePluginPlatform { ); } - /// Returns an instance using a specified [FirebaseApp] & region. - static FirebaseInstallations instanceFor({FirebaseApp? app, String? region}) { - app ??= Firebase.app(); - region ??= 'us-central1'; - String cachedKey = '${app.name}_$region'; - - if (_cachedInstances.containsKey(cachedKey)) { - return _cachedInstances[cachedKey]!; - } - - FirebaseInstallations newInstance = FirebaseInstallations._(app: app); - _cachedInstances[cachedKey] = newInstance; - - return newInstance; + /// Returns an instance using a specified [FirebaseApp]. + static FirebaseInstallations instanceFor({required FirebaseApp app}) { + return _cachedInstances.putIfAbsent(app.name, () { + return FirebaseInstallations._(app: app); + }); } /// Deletes the Firebase Installation and all associated data. @@ -65,7 +56,7 @@ class FirebaseInstallations extends FirebasePluginPlatform { } /// Sends a new event via a [Stream] whenever the Installation ID changes. - Stream onIdChange() { - return _delegate.onIdChange(); + Stream get idTokenChanges { + return _delegate.idTokenChanges; } } diff --git a/packages/firebase_installations/firebase_installations/pubspec.yaml b/packages/firebase_installations/firebase_installations/pubspec.yaml index 06320ea82b5d..b752793583f5 100644 --- a/packages/firebase_installations/firebase_installations/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/pubspec.yaml @@ -11,6 +11,7 @@ environment: dependencies: firebase_core: ^1.10.0 firebase_core_platform_interface: ^4.1.0 + firebase_installations_platform_interface: ^0.0.1 flutter: sdk: flutter diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart index 59ab3548f776..dda2dd2df660 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart @@ -1,7 +1,7 @@ +// 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. + library firebase_installations_platform_interface; -/// A Calculator. -class Calculator { - /// Returns [value] plus 1. - int addOne(int value) => value + 1; -} +export 'src/platform_interface/platform_interface_firebase_installations.dart'; diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart new file mode 100644 index 000000000000..86ed3ddf330d --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart @@ -0,0 +1,107 @@ +// 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. + +import 'dart:async'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; +import 'package:flutter/services.dart'; + +import 'utils/exception.dart'; + +class MethodChannelFirebaseInstallations extends FirebaseInstallationsPlatform { + /// Returns a stub instance to allow the platform interface to access + /// the class instance statically. + static MethodChannelFirebaseInstallations get instance { + return MethodChannelFirebaseInstallations._(); + } + + /// The [MethodChannelFirebaseFunctions] method channel. + static const MethodChannel channel = MethodChannel( + 'plugins.flutter.io/firebase_installations', + ); + + static final Map> _idTokenChangesListeners = + >{}; + + /// Creates a new [MethodChannelFirebaseInstallations] instance with an [app]. + MethodChannelFirebaseInstallations({required FirebaseApp app}) : super(app) { + channel + .invokeMethod('FirebaseInstallations#registerIdTokenListener', { + 'appName': app.name, + }).then((channelName) { + final events = EventChannel(channelName!, channel.codec); + + _idTokenChangesListeners[app.name] = StreamController.broadcast(); + + events.receiveBroadcastStream().listen( + (arguments) { + _handleIdTokenChangesListener(app.name, arguments); + }, + ); + }); + } + + /// Handle any incoming events from Event Channel and forward on to the user. + Future _handleIdTokenChangesListener( + String appName, Map arguments) async { + final StreamController controller = + _idTokenChangesListeners[appName]!; + controller.add(arguments['token']); + } + + /// Internal stub class initializer. + /// + /// When the user code calls a functions method, the real instance is + /// then initialized via the [delegateFor] method. + MethodChannelFirebaseInstallations._() : super(null); + + @override + FirebaseInstallationsPlatform delegateFor({required FirebaseApp app}) { + return MethodChannelFirebaseInstallations(app: app); + } + + @override + Future delete() async { + try { + await channel.invokeMethod('FirebaseInstallations#delete', { + 'appName': app!.name, + }); + } catch (e, s) { + throw convertPlatformException(e, s); + } + } + + @override + Future getId() async { + try { + String? id = + await channel.invokeMethod('FirebaseInstallations#getId', { + 'appName': app!.name, + }); + + return id!; + } catch (e, s) { + throw convertPlatformException(e, s); + } + } + + @override + Future getToken(bool forceRefresh) async { + try { + String? id = await channel.invokeMethod( + 'FirebaseInstallations#getToken', + {'appName': app!.name, 'forceRefresh': forceRefresh}); + + return id!; + } catch (e, s) { + throw convertPlatformException(e, s); + } + } + + @override + Stream get idTokenChanges { + return _idTokenChangesListeners[app!.name]!.stream; + } +} diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/utils/exception.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/utils/exception.dart new file mode 100644 index 000000000000..87aa836d8e24 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/utils/exception.dart @@ -0,0 +1,44 @@ +// 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. + +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/services.dart'; + +/// Catches a [PlatformException] and returns an [Exception]. +/// +/// If the [Exception] is a [PlatformException], a [FirebaseException] is returned. +Exception convertPlatformException(Object exception, [StackTrace? stackTrace]) { + if (exception is! Exception || exception is! PlatformException) { + throw exception; + } + + return platformExceptionToFirebaseException(exception, stackTrace); +} + +/// Converts a [PlatformException] into a [FirebaseException]. +/// +/// A [PlatformException] can only be converted to a [FirebaseException] if the +/// `details` of the exception exist. Firebase returns specific codes and messages +/// which can be converted into user friendly exceptions. +FirebaseException platformExceptionToFirebaseException( + PlatformException platformException, + [StackTrace? stackTrace]) { + Map? details = platformException.details != null + ? Map.from(platformException.details) + : null; + + String code = 'unknown'; + String message = platformException.message ?? ''; + + if (details != null) { + code = details['code'] ?? code; + message = details['message'] ?? message; + } + + return FirebaseException( + plugin: 'firebase_installations', + code: code, + message: message, + stackTrace: stackTrace); +} diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/platform_interface_firebase_installations.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/platform_interface_firebase_installations.dart new file mode 100644 index 000000000000..6e0f4fde626b --- /dev/null +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/platform_interface_firebase_installations.dart @@ -0,0 +1,69 @@ +// 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. + +import 'package:firebase_core/firebase_core.dart'; +import 'package:meta/meta.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import '../method_channel/method_channel_firebase_installations.dart'; + +abstract class FirebaseInstallationsPlatform extends PlatformInterface { + /// Create an instance using [app]. + FirebaseInstallationsPlatform(this.app) : super(token: _token); + + static final Object _token = Object(); + + static FirebaseInstallationsPlatform? _instance; + + /// The [FirebaseApp] this instance was initialized with + final FirebaseApp? app; + + /// Create an instance using [app] using the existing implementation + factory FirebaseInstallationsPlatform.instanceFor( + {required FirebaseApp app}) { + return FirebaseInstallationsPlatform.instance.delegateFor(app: app); + } + + /// The current default [FirebaseInstallationsPlatform] instance. + /// + /// It will always default to [MethodChannelFirebaseInstallations] + /// if no other implementation was provided. + static FirebaseInstallationsPlatform get instance { + return _instance ??= MethodChannelFirebaseInstallations.instance; + } + + /// Sets the [FirebaseInstallationsPlatform.instance] + static set instance(FirebaseInstallationsPlatform instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + /// Enables delegates to create new instances of themselves if a none default + /// [FirebaseApp] instance or region is required by the user. + @protected + FirebaseInstallationsPlatform delegateFor({required FirebaseApp app}) { + throw UnimplementedError('delegateFor() is not implemented'); + } + + /// Deletes the Firebase Installation and all associated data. + Future delete() { + throw UnimplementedError('delete() is not implemented'); + } + + /// Creates a Firebase Installation if there isn't one for the app and + /// returns the Installation ID. + Future getId() { + throw UnimplementedError('getId() is not implemented'); + } + + /// Returns an Authentication Token for the current Firebase Installation. + Future getToken(bool forceRefresh) { + throw UnimplementedError('getToken() is not implemented'); + } + + /// Sends a new event via a [Stream] whenever the Installation ID changes. + Stream get idTokenChanges { + throw UnimplementedError('get idTokenChanges is not implemented'); + } +} diff --git a/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml b/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml index 5af81d37750b..5c81fa479a8c 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml @@ -1,54 +1,22 @@ name: firebase_installations_platform_interface -description: A new Flutter package project. +description: A common platform interface for the firebase_installations plugin. version: 0.0.1 -homepage: +homepage: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations_platform_interface +repository: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations_platform_interface environment: sdk: ">=2.12.0 <3.0.0" flutter: ">=1.17.0" dependencies: + firebase_core: ^1.10.0 flutter: sdk: flutter + meta: ^1.3.0 + plugin_platform_interface: ^2.0.0 dev_dependencies: + firebase_core_platform_interface: ^4.1.0 flutter_test: sdk: flutter flutter_lints: ^1.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages From 0edd8a41194d98cf5ec0364b4c1597ca25e719d8 Mon Sep 17 00:00:00 2001 From: ehesp Date: Tue, 16 Nov 2021 11:20:23 +0000 Subject: [PATCH 05/51] chore: setup firebase_installations_web --- .../firebase_installations_web/.gitignore | 75 +++++++++++++++++++ .../firebase_installations_web/.metadata | 10 +++ .../firebase_installations_web/CHANGELOG.md | 3 + .../firebase_installations_web/LICENSE | 1 + .../firebase_installations_web/README.md | 39 ++++++++++ .../analysis_options.yaml | 4 + .../lib/firebase_installations_web.dart | 7 ++ .../firebase_installations_web/pubspec.yaml | 54 +++++++++++++ .../test/firebase_installations_web_test.dart | 12 +++ 9 files changed, 205 insertions(+) create mode 100644 packages/firebase_installations/firebase_installations_web/.gitignore create mode 100644 packages/firebase_installations/firebase_installations_web/.metadata create mode 100644 packages/firebase_installations/firebase_installations_web/CHANGELOG.md create mode 100644 packages/firebase_installations/firebase_installations_web/LICENSE create mode 100644 packages/firebase_installations/firebase_installations_web/README.md create mode 100644 packages/firebase_installations/firebase_installations_web/analysis_options.yaml create mode 100644 packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart create mode 100644 packages/firebase_installations/firebase_installations_web/pubspec.yaml create mode 100644 packages/firebase_installations/firebase_installations_web/test/firebase_installations_web_test.dart diff --git a/packages/firebase_installations/firebase_installations_web/.gitignore b/packages/firebase_installations/firebase_installations_web/.gitignore new file mode 100644 index 000000000000..a247422ef7c3 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/.gitignore @@ -0,0 +1,75 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/ephemeral +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 diff --git a/packages/firebase_installations/firebase_installations_web/.metadata b/packages/firebase_installations/firebase_installations_web/.metadata new file mode 100644 index 000000000000..db56104b21ff --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 18116933e77adc82f80866c928266a5b4f1ed645 + channel: stable + +project_type: package diff --git a/packages/firebase_installations/firebase_installations_web/CHANGELOG.md b/packages/firebase_installations/firebase_installations_web/CHANGELOG.md new file mode 100644 index 000000000000..41cc7d8192ec --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/firebase_installations/firebase_installations_web/LICENSE b/packages/firebase_installations/firebase_installations_web/LICENSE new file mode 100644 index 000000000000..ba75c69f7f21 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/firebase_installations/firebase_installations_web/README.md b/packages/firebase_installations/firebase_installations_web/README.md new file mode 100644 index 000000000000..8b55e735b501 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/firebase_installations/firebase_installations_web/analysis_options.yaml b/packages/firebase_installations/firebase_installations_web/analysis_options.yaml new file mode 100644 index 000000000000..a5744c1cfbe7 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart new file mode 100644 index 000000000000..ff9f2121002c --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart @@ -0,0 +1,7 @@ +library firebase_installations_web; + +/// A Calculator. +class Calculator { + /// Returns [value] plus 1. + int addOne(int value) => value + 1; +} diff --git a/packages/firebase_installations/firebase_installations_web/pubspec.yaml b/packages/firebase_installations/firebase_installations_web/pubspec.yaml new file mode 100644 index 000000000000..b50bef58789e --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/pubspec.yaml @@ -0,0 +1,54 @@ +name: firebase_installations_web +description: A new Flutter package project. +version: 0.0.1 +homepage: + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/firebase_installations/firebase_installations_web/test/firebase_installations_web_test.dart b/packages/firebase_installations/firebase_installations_web/test/firebase_installations_web_test.dart new file mode 100644 index 000000000000..8c21027e68e1 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/test/firebase_installations_web_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:firebase_installations_web/firebase_installations_web.dart'; + +void main() { + test('adds one to input values', () { + final calculator = Calculator(); + expect(calculator.addOne(2), 3); + expect(calculator.addOne(-7), -6); + expect(calculator.addOne(0), 1); + }); +} From bec45f1a1b069905c6edc2a4067a3e6a141d5f0d Mon Sep 17 00:00:00 2001 From: ehesp Date: Tue, 16 Nov 2021 11:56:25 +0000 Subject: [PATCH 06/51] chore: firebase_installations_web implementation --- .../firebase_installations/pubspec.yaml | 1 + .../lib/firebase_installations_web.dart | 72 +++++++++++++++++-- .../lib/src/guard.dart | 20 ++++++ .../lib/src/interop/firebase_interop.dart | 16 +++++ .../lib/src/interop/installations.dart | 71 ++++++++++++++++++ .../src/interop/installations_interop.dart | 22 ++++++ .../firebase_installations_web/pubspec.yaml | 52 ++++---------- 7 files changed, 213 insertions(+), 41 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations_web/lib/src/guard.dart create mode 100644 packages/firebase_installations/firebase_installations_web/lib/src/interop/firebase_interop.dart create mode 100644 packages/firebase_installations/firebase_installations_web/lib/src/interop/installations.dart create mode 100644 packages/firebase_installations/firebase_installations_web/lib/src/interop/installations_interop.dart diff --git a/packages/firebase_installations/firebase_installations/pubspec.yaml b/packages/firebase_installations/firebase_installations/pubspec.yaml index b752793583f5..a7a6d8238c52 100644 --- a/packages/firebase_installations/firebase_installations/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/pubspec.yaml @@ -12,6 +12,7 @@ dependencies: firebase_core: ^1.10.0 firebase_core_platform_interface: ^4.1.0 firebase_installations_platform_interface: ^0.0.1 + firebase_installations_web: ^0.0.1 flutter: sdk: flutter diff --git a/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart index ff9f2121002c..4544aa2a86b3 100644 --- a/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart +++ b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart @@ -1,7 +1,71 @@ +// 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. + library firebase_installations_web; -/// A Calculator. -class Calculator { - /// Returns [value] plus 1. - int addOne(int value) => value + 1; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_web/firebase_core_web.dart'; +import 'package:firebase_core_web/firebase_core_web_interop.dart' + as core_interop; +import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + +import 'src/guard.dart'; +import 'src/interop/installations.dart' as installations_interop; + +class FirebaseInstallationsWeb extends FirebaseInstallationsPlatform { + /// The entry point for the [FirebaseInstallationsWeb] class. + FirebaseInstallationsWeb({FirebaseApp? app}) : super(app); + + /// Stub initializer to allow the [registerWith] to create an instance without + /// registering the web delegates or listeners. + FirebaseInstallationsWeb._() + : _webInstallations = null, + super(null); + + /// Instance of installations from the web plugin. + installations_interop.Installations? _webInstallations; + + /// Lazily initialize [_webFunctions] on first method call + installations_interop.Installations get _delegate { + return _webInstallations ??= installations_interop + .getInstallationsInstance(core_interop.app(app?.name)); + } + + /// Create the default instance of the [FirebaseInstallationsPlatform] as a [FirebaseInstallationsWeb] + static void registerWith(Registrar registrar) { + FirebaseCoreWeb.registerService('installations'); + FirebaseInstallationsPlatform.instance = FirebaseInstallationsWeb.instance; + } + + /// Returns an instance of [FirebaseInstallationsWeb]. + static FirebaseInstallationsWeb get instance { + return FirebaseInstallationsWeb._(); + } + + @override + FirebaseInstallationsPlatform delegateFor({required FirebaseApp app}) { + return FirebaseInstallationsWeb(app: app); + } + + @override + Future delete() async { + return guard(() => _delegate.delete()); + } + + @override + Future getId() async { + return guard(() => _delegate.getId()); + } + + @override + Future getToken(bool forceRefresh) async { + return guard(() => _delegate.getToken(forceRefresh)); + } + + @override + Stream get idTokenChanges { + return guard(() => _delegate.onIdChange); + } } diff --git a/packages/firebase_installations/firebase_installations_web/lib/src/guard.dart b/packages/firebase_installations/firebase_installations_web/lib/src/guard.dart new file mode 100644 index 000000000000..a57cfab0ef81 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/lib/src/guard.dart @@ -0,0 +1,20 @@ +// 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. + +import 'package:firebase_core/firebase_core.dart'; + +// ignore: implementation_imports +import 'package:firebase_core/src/internals.dart' as internals; + +export 'package:firebase_core/src/internals.dart' hide guard; + +/// Will return a [FirebaseException] from a thrown web error. +/// Any other errors will be propagated as normal. +R guard(R Function() cb) { + return internals.guard( + cb, + plugin: 'firebase_installations', + codeParser: (code) => code.replaceFirst('installations/', ''), + ); +} diff --git a/packages/firebase_installations/firebase_installations_web/lib/src/interop/firebase_interop.dart b/packages/firebase_installations/firebase_installations_web/lib/src/interop/firebase_interop.dart new file mode 100644 index 000000000000..b7960feb5c86 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/lib/src/interop/firebase_interop.dart @@ -0,0 +1,16 @@ +// 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. + +// ignore_for_file: public_member_api_docs + +@JS('firebase') +library firebase_interop.firebase; + +import 'package:firebase_core_web/firebase_core_web_interop.dart'; +import 'package:js/js.dart'; + +import 'installations_interop.dart'; + +@JS() +external InstallationsJsImpl installations([AppJsImpl? app]); diff --git a/packages/firebase_installations/firebase_installations_web/lib/src/interop/installations.dart b/packages/firebase_installations/firebase_installations_web/lib/src/interop/installations.dart new file mode 100644 index 000000000000..a4a313829914 --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/lib/src/interop/installations.dart @@ -0,0 +1,71 @@ +// 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. + +import 'dart:async'; + +import 'package:firebase_core_web/firebase_core_web_interop.dart'; +import 'package:js/js.dart'; + +import 'firebase_interop.dart' as firebase_interop; +import 'installations_interop.dart' as installations_interop; + +export 'installations_interop.dart'; + +Installations getInstallationsInstance([App? app]) { + return Installations.getInstance(app != null + ? firebase_interop.installations(app.jsObject) + : firebase_interop.installations()); +} + +class Installations + extends JsObjectWrapper { + static final _expando = Expando(); + + /// Creates a new Installations from a [jsObject]. + static Installations getInstance( + installations_interop.InstallationsJsImpl jsObject) { + return _expando[jsObject] ??= Installations._fromJsObject(jsObject); + } + + Installations._fromJsObject( + installations_interop.InstallationsJsImpl jsObject) + : super.fromJsObject(jsObject); + + Future delete() => handleThenable(jsObject.delete()); + + Future getId() => handleThenable(jsObject.getId()); + + Future getToken([bool forceRefresh = false]) => + handleThenable(jsObject.getToken(forceRefresh)); + + Func0? _onIdChangedUnsubscribe; + + StreamController? _idChangeController; + + Stream get onIdChange { + if (_idChangeController == null) { + final wrapper = allowInterop((String id) { + _idChangeController!.add(id); + }); + + void startListen() { + assert(_onIdChangedUnsubscribe == null); + _onIdChangedUnsubscribe = jsObject.onIdChange(wrapper); + } + + void stopListen() { + _onIdChangedUnsubscribe!(); + _onIdChangedUnsubscribe = null; + } + + _idChangeController = StreamController.broadcast( + onListen: startListen, + onCancel: stopListen, + sync: true, + ); + } + + return _idChangeController!.stream; + } +} diff --git a/packages/firebase_installations/firebase_installations_web/lib/src/interop/installations_interop.dart b/packages/firebase_installations/firebase_installations_web/lib/src/interop/installations_interop.dart new file mode 100644 index 000000000000..187e2b02cfbd --- /dev/null +++ b/packages/firebase_installations/firebase_installations_web/lib/src/interop/installations_interop.dart @@ -0,0 +1,22 @@ +// 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. + +@JS('firebase.installations') +library firebase_interop.installations; + +import 'package:firebase_core_web/firebase_core_web_interop.dart'; +import 'package:js/js.dart'; + +@JS('Installations') +abstract class InstallationsJsImpl { + external AppJsImpl get app; + + external PromiseJsImpl delete(); + + external PromiseJsImpl getId(); + + external PromiseJsImpl getToken([bool? forceRefresh]); + + external Func0 onIdChange(Func1 observer); +} diff --git a/packages/firebase_installations/firebase_installations_web/pubspec.yaml b/packages/firebase_installations/firebase_installations_web/pubspec.yaml index b50bef58789e..13ad826b418d 100644 --- a/packages/firebase_installations/firebase_installations_web/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations_web/pubspec.yaml @@ -1,54 +1,32 @@ name: firebase_installations_web -description: A new Flutter package project. +description: The web implementation of firebase_installations. version: 0.0.1 -homepage: +homepage: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations_web +repository: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations_web environment: sdk: ">=2.12.0 <3.0.0" flutter: ">=1.17.0" dependencies: + firebase_installations_platform_interface: ^0.0.1 + firebase_core: ^1.10.0 + firebase_core_web: ^1.2.0 flutter: sdk: flutter + flutter_web_plugins: + sdk: flutter + js: ^0.6.3 dev_dependencies: + firebase_core_platform_interface: ^4.1.0 flutter_test: sdk: flutter flutter_lints: ^1.0.0 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter. flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages + plugin: + platforms: + web: + pluginClass: FirebaseInstallationsWeb + fileName: firebase_installations_web.dart From 06710559144f47549c4d29f7664c364002f939e1 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Thu, 25 Nov 2021 18:19:56 +0300 Subject: [PATCH 07/51] feat: Android implementation --- .../android/build.gradle | 29 +- .../android/src/main/AndroidManifest.xml | 6 + .../FirebaseInstallationsPlugin.java | 164 +++- .../FlutterFirebaseAppRegistrar.java | 20 + .../TokenChannelStreamHandler.java | 49 + .../android/user-agent.gradle | 22 + .../firebase_installations/example/README.md | 4 +- .../example/android/app/build.gradle | 18 +- .../example/android/app/google-services.json | 892 ++++++++++++++++++ .../android/app/src/debug/AndroidManifest.xml | 2 +- .../android/app/src/main/AndroidManifest.xml | 4 +- .../MainActivity.java | 6 - .../com/example/example/MainActivity.kt | 6 + .../app/src/profile/AndroidManifest.xml | 2 +- .../example/android/build.gradle | 3 + .../ios/Runner.xcodeproj/project.pbxproj | 43 +- .../example/ios/Runner/AppDelegate.h | 6 - .../example/ios/Runner/AppDelegate.m | 13 - .../example/ios/Runner/AppDelegate.swift | 13 + .../example/ios/Runner/Info.plist | 2 +- .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/ios/Runner/main.m | 9 - .../example/lib/main.dart | 69 +- .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../macos/Runner.xcodeproj/project.pbxproj | 572 +++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 89 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 ++ .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 46993 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 3276 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1429 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 5933 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1243 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 14800 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 1874 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 339 +++++++ .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/pubspec.yaml | 32 +- .../example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../example/web/index.html | 101 ++ .../example/web/manifest.json | 35 + .../lib/firebase_installations.dart | 1 - .../firebase_installations/pubspec.yaml | 4 +- .../test/firebase_installations_test.dart | 4 - ...method_channel_firebase_installations.dart | 5 +- 61 files changed, 2645 insertions(+), 129 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java create mode 100644 packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java create mode 100644 packages/firebase_installations/firebase_installations/android/user-agent.gradle create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/google-services.json delete mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations_example/MainActivity.java create mode 100644 packages/firebase_installations/firebase_installations/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt delete mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.m create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.swift create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/Runner-Bridging-Header.h delete mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/main.m create mode 100644 packages/firebase_installations/firebase_installations/example/macos/.gitignore create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/AppDelegate.swift create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Release.xcconfig create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/DebugProfile.entitlements create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Info.plist create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/MainFlutterWindow.swift create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Runner/Release.entitlements create mode 100644 packages/firebase_installations/firebase_installations/example/web/favicon.png create mode 100644 packages/firebase_installations/firebase_installations/example/web/icons/Icon-192.png create mode 100644 packages/firebase_installations/firebase_installations/example/web/icons/Icon-512.png create mode 100644 packages/firebase_installations/firebase_installations/example/web/icons/Icon-maskable-192.png create mode 100644 packages/firebase_installations/firebase_installations/example/web/icons/Icon-maskable-512.png create mode 100644 packages/firebase_installations/firebase_installations/example/web/index.html create mode 100644 packages/firebase_installations/firebase_installations/example/web/manifest.json diff --git a/packages/firebase_installations/firebase_installations/android/build.gradle b/packages/firebase_installations/firebase_installations/android/build.gradle index e3af2e472f55..aa39bb0c0c45 100644 --- a/packages/firebase_installations/firebase_installations/android/build.gradle +++ b/packages/firebase_installations/firebase_installations/android/build.gradle @@ -21,8 +21,21 @@ rootProject.allprojects { apply plugin: 'com.android.library' +def firebaseCoreProject = findProject(':firebase_core') +if (firebaseCoreProject == null) { + throw new GradleException('Could not find the firebase_core FlutterFire plugin, have you added it as a dependency in your pubspec?') +} else if (!firebaseCoreProject.properties['FirebaseSDKVersion']) { + throw new GradleException('A newer version of the firebase_core FlutterFire plugin is required, please update your firebase_core pubspec dependency.') +} + +def getRootProjectExtOrCoreProperty(name, firebaseCoreProject) { + if (!rootProject.ext.has('FlutterFire')) return firebaseCoreProject.properties[name] + if (!rootProject.ext.get('FlutterFire')[name]) return firebaseCoreProject.properties[name] + return rootProject.ext.get('FlutterFire').get(name) +} + android { - compileSdkVersion 30 + compileSdkVersion 29 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -30,6 +43,18 @@ android { } defaultConfig { - minSdkVersion 16 + minSdkVersion 19 + } + + dependencies { + api firebaseCoreProject + implementation platform("com.google.firebase:firebase-bom:${getRootProjectExtOrCoreProperty("FirebaseSDKVersion", firebaseCoreProject)}") + implementation 'com.google.firebase:firebase-installations' } } + +dependencies { + implementation 'androidx.annotation:annotation:1.1.0' +} + +apply from: file("./user-agent.gradle") diff --git a/packages/firebase_installations/firebase_installations/android/src/main/AndroidManifest.xml b/packages/firebase_installations/firebase_installations/android/src/main/AndroidManifest.xml index e4a70c21d7f5..279a00995d6a 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/AndroidManifest.xml +++ b/packages/firebase_installations/firebase_installations/android/src/main/AndroidManifest.xml @@ -1,3 +1,9 @@ + + + + + diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java index dfd3dc45b817..9f8946367fc6 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java @@ -1,38 +1,176 @@ package io.flutter.plugins.firebase.installations.firebase_installations; +import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.Tasks; +import com.google.firebase.FirebaseApp; +import com.google.firebase.installations.FirebaseInstallations; +import com.google.firebase.installations.InstallationTokenResult; +import com.google.firebase.installations.internal.FidListener; + import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugins.firebase.core.FlutterFirebasePlugin; +import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry; -/** FirebaseInstallationsPlugin */ -public class FirebaseInstallationsPlugin implements FlutterPlugin, MethodCallHandler { - /// The MethodChannel that will the communication between Flutter and native Android - /// - /// This local reference serves to register the plugin with the Flutter Engine and unregister it - /// when the Flutter Engine is detached from the Activity +/** + * FirebaseInstallationsPlugin + */ +public class FirebaseInstallationsPlugin implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler { private MethodChannel channel; + private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_installations"; + private final Map streamHandlers = new HashMap<>(); + + @Nullable + private BinaryMessenger messenger; + + private MethodChannel setup(BinaryMessenger binaryMessenger) { + final MethodChannel channel = + new MethodChannel(binaryMessenger, METHOD_CHANNEL_NAME); + channel.setMethodCallHandler(this); + this.messenger = binaryMessenger; + return channel; + } + @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { - channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "firebase_installations"); - channel.setMethodCallHandler(this); + BinaryMessenger binaryMessenger = flutterPluginBinding.getBinaryMessenger(); + channel = setup(binaryMessenger); + + FlutterFirebasePluginRegistry.registerPlugin(METHOD_CHANNEL_NAME, this); + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + channel.setMethodCallHandler(null); + channel = null; + messenger = null; + + removeEventListeners(); + + } + + private FirebaseInstallations getInstallations(Map arguments) { + @NonNull String appName = (String) Objects.requireNonNull(arguments.get("appName")); + FirebaseApp app = FirebaseApp.getInstance(appName); + return FirebaseInstallations.getInstance(app); + } + + private Task getId(Map arguments) { + return Tasks.call(cachedThreadPool, () -> Tasks.await(getInstallations(arguments).getId())); + } + + private Task getToken(Map arguments) { + return Tasks.call( + cachedThreadPool, + () -> { + FirebaseInstallations firebaseInstallations = getInstallations(arguments); + Boolean forceRefresh = (Boolean) Objects.requireNonNull(arguments.get("forceRefresh")); + InstallationTokenResult tokenResult = Tasks.await(firebaseInstallations.getToken(forceRefresh)); + return tokenResult.getToken(); + }); + } + + private Task registerTokenListener(Map arguments) { + return Tasks.call( + cachedThreadPool, + () -> { + String appName = (String) Objects.requireNonNull(arguments.get("appName")); + FirebaseInstallations firebaseInstallations = getInstallations(arguments); + + TokenChannelStreamHandler handler = new TokenChannelStreamHandler(firebaseInstallations); + + final String name = METHOD_CHANNEL_NAME + "/token/" + appName; + final EventChannel channel = new EventChannel(messenger, name); + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); + + return name; + }); + } + + private Task deleteId(Map arguments) { + return Tasks.call(cachedThreadPool, () -> Tasks.await(getInstallations(arguments).delete())); } @Override public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { - if (call.method.equals("getPlatformVersion")) { - result.success("Android " + android.os.Build.VERSION.RELEASE); + Task methodCallTask; + + switch (call.method) { + case "FirebaseInstallations#getId": + methodCallTask = getId(call.arguments()); + break; + case "FirebaseInstallations#getToken": + methodCallTask = getToken(call.arguments()); + break; + case "FirebaseInstallations#delete": + methodCallTask = deleteId(call.arguments()); + break; + case "FirebaseInstallations#registerIdTokenListener": + methodCallTask = registerTokenListener(call.arguments()); + break; + + default: + result.notImplemented(); + return; + + } + + methodCallTask.addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(task.getResult()); + } else { + Exception exception = task.getException(); + result.error( + "firebase_installations", + exception != null ? exception.getMessage() : null, + getExceptionDetails(exception)); + } + }); + } + + private Map getExceptionDetails(@Nullable Exception exception) { + Map details = new HashMap<>(); + details.put("code", "unknown"); + if (exception != null) { + details.put("message", exception.getMessage()); } else { - result.notImplemented(); + details.put("message", "An unknown error has occurred."); } + return details; } + @Override - public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { - channel.setMethodCallHandler(null); + public Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { + return Tasks.call(cachedThreadPool, () -> null); + } + + @Override + public Task didReinitializeFirebaseCore() { + return Tasks.call(cachedThreadPool, () -> null); + } + + private void removeEventListeners() { + for (EventChannel eventChannel : streamHandlers.keySet()) { + EventChannel.StreamHandler streamHandler = streamHandlers.get(eventChannel); + streamHandler.onCancel(null); + eventChannel.setStreamHandler(null); + } + streamHandlers.clear(); } } diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java new file mode 100644 index 000000000000..4eef816fabb2 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java @@ -0,0 +1,20 @@ +// 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.installations.firebase_installations; +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_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java new file mode 100644 index 000000000000..9c9acca7ecbf --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java @@ -0,0 +1,49 @@ +package io.flutter.plugins.firebase.installations.firebase_installations; + +import androidx.annotation.NonNull; + +import com.google.firebase.installations.FirebaseInstallations; +import com.google.firebase.installations.internal.FidListener; + +import java.util.HashMap; +import java.util.Map; + +import io.flutter.Log; +import io.flutter.plugin.common.EventChannel; + +public class TokenChannelStreamHandler implements EventChannel.StreamHandler { + + private final FirebaseInstallations firebaseInstallations; + private FidListener listener; + + public TokenChannelStreamHandler(FirebaseInstallations firebaseInstallations) { + this.firebaseInstallations = firebaseInstallations; + } + + @Override + public void onListen(Object arguments, EventChannel.EventSink events) { + + listener = createTokenEventListener(events); + + + firebaseInstallations.registerFidListener(listener); + } + + @Override + public void onCancel(Object arguments) { + if (listener != null) { + listener = null; + } + } + + FidListener createTokenEventListener(final EventChannel.EventSink events) { + return token -> { + Map event = new HashMap<>(); + + Log.d("TOKEN", token); + event.put("token" , token); + + events.success(event); + }; + } +} diff --git a/packages/firebase_installations/firebase_installations/android/user-agent.gradle b/packages/firebase_installations/firebase_installations/android/user-agent.gradle new file mode 100644 index 000000000000..3454bf0b3a48 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/android/user-agent.gradle @@ -0,0 +1,22 @@ +import java.util.regex.Matcher +import java.util.regex.Pattern + +String libraryVersionName = "UNKNOWN" +String libraryName = "flutter-fire-rc" +File pubspec = new File(project.projectDir.parentFile, 'pubspec.yaml') + +if (pubspec.exists()) { + String yaml = pubspec.text + // Using \s*['|"]?([^\n|'|"]*)['|"]? to extract version number. + Matcher versionMatcher = Pattern.compile("^version:\\s*['|\"]?([^\\n|'|\"]*)['|\"]?\$", Pattern.MULTILINE).matcher(yaml) + if (versionMatcher.find()) libraryVersionName = versionMatcher.group(1).replaceAll("\\+", "-") +} + +android { + defaultConfig { + // BuildConfig.VERSION_NAME + buildConfigField 'String', 'LIBRARY_VERSION', "\"${libraryVersionName}\"" + // BuildConfig.LIBRARY_NAME + buildConfigField 'String', 'LIBRARY_NAME', "\"${libraryName}\"" + } +} diff --git a/packages/firebase_installations/firebase_installations/example/README.md b/packages/firebase_installations/firebase_installations/example/README.md index 585edf015576..a13562602822 100644 --- a/packages/firebase_installations/firebase_installations/example/README.md +++ b/packages/firebase_installations/firebase_installations/example/README.md @@ -1,6 +1,6 @@ -# firebase_installations_example +# example -Demonstrates how to use the firebase_installations plugin. +A new Flutter project. ## Getting Started diff --git a/packages/firebase_installations/firebase_installations/example/android/app/build.gradle b/packages/firebase_installations/firebase_installations/example/android/app/build.gradle index 348c56c09039..a8941c290917 100644 --- a/packages/firebase_installations/firebase_installations/example/android/app/build.gradle +++ b/packages/firebase_installations/firebase_installations/example/android/app/build.gradle @@ -22,6 +22,8 @@ if (flutterVersionName == null) { } apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'com.google.gms.google-services' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { @@ -32,10 +34,18 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "io.flutter.plugins.firebase.installations.firebase_installations_example" - minSdkVersion 16 + applicationId "io.flutter.plugins.firebase.installations.example" + minSdkVersion 19 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName @@ -53,3 +63,7 @@ android { flutter { source '../..' } + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/packages/firebase_installations/firebase_installations/example/android/app/google-services.json b/packages/firebase_installations/firebase_installations/example/android/app/google-services.json new file mode 100644 index 000000000000..4b6c0fccd142 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/android/app/google-services.json @@ -0,0 +1,892 @@ +{ + "project_info": { + "project_number": "448618578101", + "firebase_url": "https://react-native-firebase-testing.firebaseio.com", + "project_id": "react-native-firebase-testing", + "storage_bucket": "react-native-firebase-testing.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:8a26b64c4bb2bd1dac3efc", + "android_client_info": { + "package_name": "com.example.firebase_in_app_messaging_example" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:cc6c1dc7a65cc83c", + "android_client_info": { + "package_name": "com.invertase.testing" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-a9p7bj5jlakabp22fo3cbkj7nsmag24e.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.invertase.testing", + "certificate_hash": "889b4292c735f371168a372cc7778992cd8a5052" + } + }, + { + "client_id": "448618578101-f50e0ln93159r9nlhr1ktmf125nf64g1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.invertase.testing", + "certificate_hash": "a094b2938a1d0cdcbb9b7a6611d1731cbdb641d8" + } + }, + { + "client_id": "448618578101-gva3jv7cr8qquj04k0o7cni674j65kha.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.invertase.testing", + "certificate_hash": "5e8f16062ea3cd2c4a0d547876baa6f38cabf625" + } + }, + { + "client_id": "448618578101-h0o9b94jnhcoal2qgjn7s7ckkc2n7okq.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.invertase.testing", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "448618578101-pdjje2lkv3p941e03hkrhfa7459cr2v8.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.invertase.testing", + "certificate_hash": "992e468b990cc418f306d0131be61ecfad800ac1" + } + }, + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:cc5ce91648e65dbeac3efc", + "android_client_info": { + "package_name": "com.notifeetestapp" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-j9nluebtat700ua550esfvaf64gbo5l5.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.notifeetestapp", + "certificate_hash": "5e8f16062ea3cd2c4a0d547876baa6f38cabf625" + } + }, + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:6aa085e64d694703ac3efc", + "android_client_info": { + "package_name": "com.rnfbdemo" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:6bf0706c1f27114dac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.cloudfunctions.cloudfunctionsexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:5cc04a661d27c405ac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.crashlytics.firebasecrashlyticsexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:1be54ee660fd87d2ac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.dynamiclinksexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-b5v53gfm2pgtblp8iu352ett69jssghb.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.dynamiclinksexample", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:e005c2b7f723853fac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.firebaseremoteconfigexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:3ad281c0067ccf97ac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.firestoreexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-npu5ll2fj4emgvtietpb685fvdm7fg3s.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.firestoreexample", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:a723be2eb2bf60d9ac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.installations.example" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:0568e76dc62e89bcac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.messaging.example" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:507d24bc5fc4d20eac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebaseanalyticsexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:9d44a7b85d1ab0baac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebaseauthexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-qd7qb4i251kmq2ju79bl7sif96si0ve3.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebaseauthexample", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "448618578101-velutq65ok2dr5ohh0oi1q62irr920ss.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebaseauthexample", + "certificate_hash": "29142b8612b4b6a0ba0fefd1dbf65ab565fb2cbd" + } + }, + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:0446912d5f1476b6ac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecoreexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:29bf96f913c195f5ac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecrashlyticsexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:a7b3b683e70a7a17ac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasedatabaseexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:d767a536227718bcac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasemessagingexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-rthm8sh42ifgn9vp60914nol7u8h7mgq.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebasemessagingexample", + "certificate_hash": "29142b8612b4b6a0ba0fefd1dbf65ab565fb2cbd" + } + }, + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:56e2f97d61c5da38ac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasemlcustomexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:f2548276e02d9ddbac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebaseperformanceexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sn6oicnu6cmq0lfa84hit4t5vs0e6676.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebaseperformanceexample", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:553625b1be8cf2efac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasestorageexample" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:448618578101:android:5180baaa9cc2b8fcac3efc", + "android_client_info": { + "package_name": "io.flutter.plugins.flutterfire_ui.flutterfire_ui_example" + } + }, + "oauth_client": [ + { + "client_id": "448618578101-ld5ohh347f6fkfggetdn3qnda99n813a.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.flutterfire_ui.flutterfire_ui_example", + "certificate_hash": "b365a398dd6441427be2a9783ef98bc4fb39a2e8" + } + }, + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "448618578101-sg12d2qin42cpr00f8b0gehs5s7inm0v.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.invertase.testing", + "app_store_id": "123456789" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/debug/AndroidManifest.xml b/packages/firebase_installations/firebase_installations/example/android/app/src/debug/AndroidManifest.xml index d13fb56ad4ff..2da223860fd7 100644 --- a/packages/firebase_installations/firebase_installations/example/android/app/src/debug/AndroidManifest.xml +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="io.flutter.plugins.firebase.installations.example"> diff --git a/packages/firebase_installations/firebase_installations/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_installations/firebase_installations/example/android/app/src/main/AndroidManifest.xml index f67de2925191..b3d025d66152 100644 --- a/packages/firebase_installations/firebase_installations/example/android/app/src/main/AndroidManifest.xml +++ b/packages/firebase_installations/firebase_installations/example/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ + package="io.flutter.plugins.firebase.installations.example"> + package="io.flutter.plugins.firebase.installations.example"> diff --git a/packages/firebase_installations/firebase_installations/example/android/build.gradle b/packages/firebase_installations/firebase_installations/example/android/build.gradle index 622ddc5c15ef..fd01d85a8223 100644 --- a/packages/firebase_installations/firebase_installations/example/android/build.gradle +++ b/packages/firebase_installations/firebase_installations/example/android/build.gradle @@ -1,4 +1,5 @@ buildscript { + ext.kotlin_version = '1.3.50' repositories { google() mavenCentral() @@ -6,6 +7,8 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.google.gms:google-services:4.3.8' } } diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj index dfa033066a88..c6759a6e8f37 100644 --- a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,8 +9,7 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; - 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -33,13 +32,12 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -74,7 +72,6 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, ); sourceTree = ""; }; @@ -89,27 +86,18 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, ); path = Runner; sourceTree = ""; }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -144,6 +132,7 @@ TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; }; }; }; @@ -215,8 +204,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -298,12 +286,15 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.installations.firebaseInstallationsExample; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; @@ -408,6 +399,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -418,12 +410,16 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.installations.firebaseInstallationsExample; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -433,12 +429,15 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.installations.firebaseInstallationsExample; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.h b/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.m b/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 70e83933db14..000000000000 --- a/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#import "AppDelegate.h" -#import "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - // Override point for customization after application launch. - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.swift b/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000000..70693e4a8c12 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist b/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist index 3ee5f2138549..a060db61e461 100644 --- a/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist @@ -11,7 +11,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - firebase_installations_example + example CFBundlePackageType APPL CFBundleShortVersionString diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Runner-Bridging-Header.h b/packages/firebase_installations/firebase_installations/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000000..308a2a560b42 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/main.m b/packages/firebase_installations/firebase_installations/example/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/packages/firebase_installations/firebase_installations/example/ios/Runner/main.m +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart index a4d22a9aa2d8..1d682a25adbc 100644 --- a/packages/firebase_installations/firebase_installations/example/lib/main.dart +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -1,10 +1,14 @@ -import 'package:flutter/material.dart'; -import 'dart:async'; +import 'dart:developer'; -import 'package:flutter/services.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/material.dart'; import 'package:firebase_installations/firebase_installations.dart'; -void main() { +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + + await Firebase.initializeApp(); + runApp(const MyApp()); } @@ -16,33 +20,26 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - String _platformVersion = 'Unknown'; - @override void initState() { super.initState(); - initPlatformState(); + logResults(); + + FirebaseInstallations.instance.idTokenChanges.listen((event) { + log(event); + }).onError((error) { + log("$error"); + }); } - // Platform messages are asynchronous, so we initialize in an async method. - Future initPlatformState() async { - String platformVersion; - // Platform messages may fail, so we use a try/catch PlatformException. - // We also handle the message potentially returning null. - try { - platformVersion = - await FirebaseInstallations.platformVersion ?? 'Unknown platform version'; - } on PlatformException { - platformVersion = 'Failed to get platform version.'; - } - - // If the widget was removed from the tree while the asynchronous platform - // message was in flight, we want to discard the reply rather than calling - // setState to update our non-existent appearance. - if (!mounted) return; + String id = ''; + String oldToken = ''; + + Future logResults() async { + final id = await FirebaseInstallations.instance.getId(); setState(() { - _platformVersion = platformVersion; + this.id = id; }); } @@ -53,9 +50,29 @@ class _MyAppState extends State { appBar: AppBar( title: const Text('Plugin example app'), ), - body: Center( - child: Text('Running on: $_platformVersion\n'), + body: Column( + children: [ + Center( + child: Text("Id: $id"), + ), + ElevatedButton( + onPressed: () async { + await FirebaseInstallations.instance.getToken(true); + }, + child: const Text("Force update token"), + ) + ], ), + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.delete), + onPressed: () async { + await FirebaseInstallations.instance.delete(); + final _newid = await FirebaseInstallations.instance.getId(); + + setState(() { + id = _newid; + }); + }), ), ); } diff --git a/packages/firebase_installations/firebase_installations/example/macos/.gitignore b/packages/firebase_installations/firebase_installations/example/macos/.gitignore new file mode 100644 index 000000000000..746adbb6b9e1 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/packages/firebase_installations/firebase_installations/example/macos/Flutter/Flutter-Debug.xcconfig b/packages/firebase_installations/firebase_installations/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 000000000000..4b81f9b2d200 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/firebase_installations/firebase_installations/example/macos/Flutter/Flutter-Release.xcconfig b/packages/firebase_installations/firebase_installations/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 000000000000..5caa9d1579e4 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.pbxproj b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..cc89c8782812 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0930; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000000..18d981003d68 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000000..ae8ff59d97b3 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000000..1d526a16ed0f --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000000..18d981003d68 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/AppDelegate.swift b/packages/firebase_installations/firebase_installations/example/macos/Runner/AppDelegate.swift new file mode 100644 index 000000000000..d53ef6437726 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000000..a2ec33f19f11 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea GIT binary patch literal 46993 zcmZ5|3p`X?`~OCwR3s6~xD(})N~M}fiXn6%NvKp3QYhuNN0*apqmfHdR7#ShNQ99j zQi+P9nwlXbmnktZ_WnO>bl&&<{m*;O=RK!cd#$zCdM@AR`#jH%+2~+BeX7b-48x|= zZLBt9*d+MZNtpCx_&asa{+CselLUV<<&ceQ5QfRjLjQDSL-t4eq}5znmIXDtfA|D+VRV$*2jxU)JopC)!37FtD<6L^&{ia zgVf1p(e;c3|HY;%uD5<-oSFkC2JRh- z&2RTL)HBG`)j5di8ys|$z_9LSm^22*uH-%MmUJs|nHKLHxy4xTmG+)JoA`BN7#6IN zK-ylvs+~KN#4NWaH~o5Wuwd@W?H@diExdcTl0!JJq9ZOA24b|-TkkeG=Q(pJw7O;i z`@q+n|@eeW7@ z&*NP+)wOyu^5oNJ=yi4~s_+N)#M|@8nfw=2#^BpML$~dJ6yu}2JNuq!)!;Uwxic(z zM@Wa-v|U{v|GX4;P+s#=_1PD7h<%8ey$kxVsS1xt&%8M}eOF98&Rx7W<)gY(fCdmo{y*FPC{My!t`i=PS1cdV7DD=3S1J?b2<5BevW7!rWJ%6Q?D9UljULd*7SxX05PP^5AklWu^y` z-m9&Oq-XNSRjd|)hZ44DK?3>G%kFHSJ8|ZXbAcRb`gH~jk}Iwkl$@lqg!vu)ihSl= zjhBh%%Hq|`Vm>T7+SYyf4bI-MgiBq4mZlZmsKv+S>p$uAOoNxPT)R6owU%t*#aV}B z5@)X8nhtaBhH=={w;Du=-S*xvcPz26EI!gt{(hf;TllHrvku`^8wMj7-9=By>n{b= zHzQ?Wn|y=;)XM#St@o%#8idxfc`!oVz@Lv_=y(t-kUC`W)c0H2TX}Lop4121;RHE(PPHKfe_e_@DoHiPbVP%JzNudGc$|EnIv`qww1F5HwF#@l(=V zyM!JQO>Rt_PTRF1hI|u^2Uo#w*rdF*LXJky0?|fhl4-M%zN_2RP#HFhSATE3&{sos zIE_?MdIn!sUH*vjs(teJ$7^7#|M_7m`T>r>qHw>TQh?yhhc8=TJk2B;KNXw3HhnQs za(Uaz2VwP;82rTy(T3FJNKA86Y7;L(K=~BW_Q=jjRh=-k_=wh-$`nY+#au+v^C4VV z)U?X(v-_#i=3bAylP1S*pM_y*DB z2fR!imng6Dk$>dl*K@AIj<~zw_f$T!-xLO8r{OkE(l?W#W<={460Y02*K#)O4xp?W zAN+isO}!*|mN7B#jUt&!KNyFOpUxv&ybM>jmkfn8z^llBslztv!!`TBEPwu;#eR3d z@_VDa)|ByvXx1V=^Up4{;M8ji3FC7gm(C7Ty-#1gs+U<{Ouc(iV67{< zam#KwvR&s=k4W<13`}DxzJ9{TUa97N-cgWkCDc+C339)EEnC@^HQK6OvKDSCvNz(S zOFAF_6omgG!+zaPC8fBO3kH8YVBx9_AoM?->pv~@$saf(Myo|e@onD`a=;kO*Utem ze=eUH&;JB2I4}?Pm@=VnE+yb$PD~sA5+)|iH3bi|s?ExIePeoAMd(Z4Z%$mCu{t;B9(sgdG~Q}0ShAwe!l8nw0tJn zJ+m?ogrgty$3=T&6+JJa!1oS3AtQQ1gJ z3gR1<=hXU>{SB-zq!okl4c+V9N;vo4{fyGeqtgBIt%TPC1P&k!pR-GZ7O8b}9=%>3 zQrV%FQdB+CcCRKK)0}v>U25rbQk(1^9Ax|WcAo5?L(H&H@%zAoT2RH$iN6boyXpsYqME}WJZI6T%OMlkWXK>R`^7AHG&31 z&MIU}igQ7$;)7AEm#dXA+!I&6ymb7n6D;F7c$tO3Ql(`ht z1sFrzIk_q5#=!#D(e~#SdWz5K;tPF*R883Yu>*@jTeOGUjQekw zM+7HlfP{y8p}jA9bLfyKC_Ti8k#;AVp@RML^9MQp-E+Ns-Y zKA!aAZV-sfm<23fy#@TZZlQVQxH%R7rD}00LxHPUF!Yg3%OX ziDe4m<4fp{7ivBS?*AlJz$~vw5m)Ei8`|+~xOSqJ$waA0+Yys$z$9iN9TIXu8 zaYacjd09uRAsU|)g|03w`F|b1Xg#K~*Mp2X^K^)r3P^juoc}-me&YhkW3#G|H<~jK zoKD?lE@jOw7>4cpKkh!8qU!bF(i~Oa8a!EGy-j46eZYbKUvF=^^nq`EtWFK}gwrsB zeu<6~?mk+;+$whP)8ud8vjqh+NofU+Nu`~|pb&CN1y_idxxf6cGbT=fBZR_hl&G)GgnW$*oDrN-zz;cKs18n+dAn95w z)Y>l6!5eYpebJGw7it~Q5m}8$7@%p&KS=VtydFj4HPJ{xqUVS_Ih}c(^4nUdwG|0% zw8Fnm{IT`8MqoL(1BNtu_#7alS@3WSUUOFT@U*`V!zrPIeCbbO=pE%|g92$EU|lw; z^;^AqMVWVf-R5^OI79TzIyYf}HX%0Y)=aYH;EKo}?=R~ZM&s&F;W>u%hFUfNafb;- z8OkmkK3k||J#3`xdLuMJAhj9oPI?Cjt}cDN7hw26n7irWS0hsy`fs&Y?Y&(QF*Nu! z!p`NggHXaBU6$P42LkqnKsPG@363DHYGXg{!|z6VMAQt??>FK1B4x4{j;iY8A+7o% z*!0qt&w+w#Ob@pQp;q)u0;v^9FlY=AK>2!qku)!%TO<^lNBr!6R8X)iXgXi^1p`T8 z6sU@Y_Fsp6E89E1*jz~Tm2kF=mjYz_q99r^v0h-l7SP6azzL%woM6!7>IFWyizrNwAqoia3nN0q343q zFztMPh0)?ugQg5Izbk{5$EGcMzt*|=S8ZFK%O&^YV@V;ZRL>f!iG?s5z{(*Xq20c^ z(hkk~PljBo%U`$q>mz!ir7chKlE-oHA2&0i@hn4O5scsI&nIWsM>sYg;Ph5IO~VpT z%c-3_{^N>4kECzk?2~Z@V|jWio&a&no;boiNxqXOpS;ph)gEDFJ6E=zPJ$>y5w`U0 z;h9_6ncIEY?#j1+IDUuixRg&(hw+QSSEmFi%_$ua$^K%(*jUynGU@FlvsyThxqMRw z7_ALpqTj~jOSu2_(@wc_Z?>X&(5jezB6w-@0X_34f&cZ=cA-t%#}>L7Q3QRx1$qyh zG>NF=Ts>)wA)fZIlk-kz%Xa;)SE(PLu(oEC8>9GUBgd$(^_(G6Y((Hi{fsV; zt*!IBWx_$5D4D&ezICAdtEU!WS3`YmC_?+o&1RDSfTbuOx<*v`G<2SP;5Q4TqFV&q zJL=90Lcm^TL7a9xck}XPMRnQ`l0%w-fi@bRI&c*VDj!W4nj=qaQd$2U?^9RTT{*qS_)Q9OL>s}2P3&da^Pf(*?> z#&2bt;Q7N2`P{{KH@>)Tf5&za?crRmQ%8xZi<9f=EV3={K zwMet=oA0-@`8F;u`8j-!8G~0TiH5yKemY+HU@Zw3``1nT>D ziK465-m?Nm^~@G@RW2xH&*C#PrvCWU)#M4jQ`I*>_^BZB_c!z5Wn9W&eCBE(oc1pw zmMr)iu74Xl5>pf&D7Ml>%uhpFGJGyj6Mx=t#`}Mt3tDZQDn~K`gp0d)P>>4{FGiP$sPK*ExVs!1)aGgAX z6eA;-9@@Muti3xYv$8U{?*NxlHxs?)(6%!Iw&&l79K86h+Z8;)m9+(zzX?cS zH*~)yk)X^H1?AfL!xctY-8T0G0Vh~kcP=8%Wg*zZxm*;eb)TEh&lGuNkqJib_}i;l z*35qQ@}I#v;EwCGM2phE1{=^T4gT63m`;UEf5x2Get-WSWmt6%T6NJM`|tk-~4<#HHwCXuduB4+vW!BywlH8murH@|32CNxx7} zAoF?Gu02vpSl|q1IFO0tNEvKwyH5V^3ZtEO(su1sIYOr{t@Tr-Ot@&N*enq;Je38} zOY+C1bZ?P~1=Qb%oStI-HcO#|WHrpgIDR0GY|t)QhhTg*pMA|%C~>;R4t_~H1J3!i zyvQeDi&|930wZlA$`Wa9)m(cB!lPKD>+Ag$5v-}9%87`|7mxoNbq7r^U!%%ctxiNS zM6pV6?m~jCQEKtF3vLnpag``|bx+eJ8h=(8b;R+8rzueQvXgFhAW*9y$!DgSJgJj% zWIm~}9(R6LdlXEg{Y3g_i7dP^98=-3qa z$*j&xC_$5btF!80{D&2*mp(`rNLAM$JhkB@3al3s=1k^Ud6HHontlcZw&y?`uPT#a za8$RD%e8!ph8Ow7kqI@_vd7lgRhkMvpzp@4XJ`9dA@+Xk1wYf`0Dk!hIrBxhnRR(_ z%jd(~x^oqA>r>`~!TEyhSyrwNA(i}={W+feUD^8XtX^7^Z#c7att{ot#q6B;;t~oq zct7WAa?UK0rj0yhRuY$7RPVoO29JV$o1Z|sJzG5<%;7pCu%L-deUon-X_wAtzY@_d z6S}&5xXBtsf8TZ13chR&vOMYs0F1?SJcvPn>SFe#+P3r=6=VIqcCU7<6-vxR*BZUm zO^DkE{(r8!e56)2U;+8jH4tuD2c(ptk0R{@wWK?%Wz?fJckr9vpIU27^UN*Q$}VyHWx)reWgmEls}t+2#Zm z_I5?+htcQl)}OTqF<`wht89>W*2f6e)-ewk^XU5!sW2A2VtaI=lggR&I z;Rw{xd)WMqw`VUPbhrx!!1Eg_*O0Si6t@ny)~X^Gu8wZZDockr)5)6tm+<=z+rYu? zCof+;!nq6r9MAfh zp4|^2w^-3vFK~{JFX|F5BIWecBJkkEuE%iP8AZ z^&e|C+VEH&i(4Y|oWPCa#C3T$129o5xaJa=y8f(!k&q+x=M|rq{?Zw_n?1X-bt&bP zD{*>Io`F4(i+5eE2oEo6iF}jNAZ52VN&Cp>LD{MyB=mCeiwP+v#gRvr%W)}?JBTMY z_hc2r8*SksC%(pp$KGmWSa|fx;r^9c;~Q(Jqw1%;$#azZf}#Fca9NZOh{*YxV9(1ivVA^2Wz>!A&Xvmm-~{y8n!^Jdl8c>`J#=2~!P{ zC1g_5Ye3={{fB`R%Q|%9<1p1;XmPo5lH5PHvX$bCIYzQhGqj7hZ?@P4M0^mkejD|H zVzARm7LRy|8`jSG^GpxRIs=aD>Y{Cb>^IwGEKCMd5LAoI;b{Q<-G}x*e>86R8dNAV z<@jb1q%@QQanW1S72kOQ$9_E#O?o}l{mHd=%Dl{WQcPio$baXZN!j{2m)TH1hfAp{ zM`EQ=4J`fMj4c&T+xKT!I0CfT^UpcgJK22vC962ulgV7FrUrII5!rx1;{@FMg(dIf zAC}stNqooiVol%%TegMuWnOkWKKA}hg6c)ssp~EnTUVUI98;a}_8UeTgT|<%G3J=n zKL;GzAhIQ_@$rDqqc1PljwpfUwiB)w!#cLAkgR_af;>}(BhnC9N zqL|q8-?jsO&Srv54TxVuJ=rfcX=C7{JNV zSmW@s0;$(#!hNuU0|YyXLs{9$_y2^fRmM&g#toh}!K8P}tlJvYyrs6yjTtHU>TB0} zNy9~t5F47ocE_+%V1(D!mKNBQc{bnrAbfPC2KO?qdnCv8DJzEBeDbW}gd!g2pyRyK`H6TVU^~K# z488@^*&{foHKthLu?AF6l-wEE&g1CTKV|hN7nP+KJnkd0sagHm&k{^SE-woW9^fYD z7y?g*jh+ELt;$OgP>Se3o#~w9qS}!%#vBvB?|I-;GM63oYrJ}HFRW6D+{54v@PN8K z2kG8`!VVc+DHl^8y#cevo4VCnTaPTzCB%*)sr&+=p{Hh#(MwaJbeuvvd!5fd67J_W za`oKxTR=mtM7P}i2qHG8=A(39l)_rHHKduDVA@^_Ueb7bq1A5#zHAi**|^H@fD`_W z#URdSG86hhQ#&S-Vf_8b`TIAmM55XhaHX7}Ci-^(ZDs*yb-WrWV&(oAQu3vMv%u$5 zc;!ADkeNBN_@47r!;%G3iFzo;?k)xTS-;1D-YeS5QXN7`p2PzGK~e6ib;8COBa5)p zfMn}dA--&A12~zr&GVk?qnBGfIEo`5yir;-Q;ZLn{Fimdrk;e!)q`sAkYh^~^>4Q@ zN5RT>s38+`V{|6@k&vZW!W0*BEqV&~34d+Ev8h)ObYL7Bd_hgbUzjdJaXP=S@Dp6X z)i013q3K4Gr5d%2YIp>218pYK!xwH;k)j?uUrT-yVKLg*L3y~=a+qd!RWGTL`z>29 z-Zb4Y{%pT%`R-iA#?T58c-i@?jf-Ckol9O>HAZPUxN%Z=<4ad9BL7n`_kH0i#E(m& zaNb039+z~ONUCLsf_a|x*&ptU?`=R*n}rm-tOdCDrS!@>>xBg)B3Sy8?x^e=U=i8< zy7H-^BPfM}$hf*d_`Qhk_V$dRYZw<)_mbC~gPPxf0$EeXhl-!(ZH3rkDnf`Nrf4$+ zh?jsRS+?Zc9Cx7Vzg?q53ffpp43po22^8i1Obih&$oBufMR;cT2bHlSZ#fDMZZr~u zXIfM5SRjBj4N1}#0Ez|lHjSPQoL&QiT4mZn=SxHJg~R`ZjP!+hJ?&~tf$N!spvKPi zfY;x~laI9X`&#i#Z}RJ`0+MO_j^3#3TQJu2r;A-maLD8xfI+2Y*iDf4LsQ$9xiu?~ z?^wHEf^qlgtjdj(u_(W5sbGx1;maVPDHvI-76u2uUywf;>()=e>0le;bO0LIvs)iy z*lJTO+7gyf^)2uS-PhS_O-+RToQmc6VT>ej^y^stNkwIxUg?E|YMAAwQ}U!dC&cXL ziXKU?zT~xbh6C};rICGbdX~;8Z%L~Jdg|`senVEJo-CiDsX47Kc`;EiXWO<9o)(`4 zGj(9@c+Me=F~y(HUehcAy!tkoM&e1y#(qqCkE(0lik_U>wg8vOhGR(=gBGFSbR`mh zn-%j3VTD4 zwA1Kqw!OSgi_v0;6?=Bk4Z{l-7Fl4`ZT535OC{73{rBwpNHMPH>((4G`sh zZhr!v{zM@4Q$5?8)Jm;v$A2v$Yp9qFG7y`9j7O-zhzC+7wr3Cb8sS$O{yOFOODdL) zV2pU{=nHne51{?^kh%a$WEro~o(rKQmM!p?#>5Pt`;!{0$2jkmVzsl|Nr^UF^IHxG z8?HmZEVMY~ec%Ow6hjfg6!9hCC4xY?V;5Ipo-myV=3TmfT^@XkKME`+=_inm4h7ki z->K~a+20?)zic^zc&7h=0)T{Aa24FU_}(O|9DMW3Bf>MW=O%~8{unFxp4}B+>>_KN zU%rKs3Va&&27&OX4-o&y2ie|sN2p-=S^V<2wa2NUQ4)?0e|hgna*1R7(#R_ys3xmG zE#(ry+q=O~&t|RX@ZMD`-)0QmE*x%SBc(Yvq60JtCQ4RL(gdA(@=}0rYo5yKz36bW zkvLOosP6I?7qH!rce(}q@cH-{oM2ThKV2RZe+{{25hkc?T>=Tky12xHr0jmfH@SZi zLHPJ@^Oo^Zo%`gZk_hrbCzS+t|=O!Bt zWi|>M8mz~sD|Z>C1ZPf_Cs&R!S5E2qK+@j*UpP>;5_|+h+y{gb=zub7#QKSUabet# zFH2H0ul;zO+uc+V=W_W@_Ig-791T7J9&=5)wrBE?JEHS_A6P~VQ)u6s1)Pu|VxP(aYJV*(e<)(42R zm3AK>dr1QLbC1RMoQ|M5k+TWBjY9q+_vY=K-tUte35m4RWl51A<4O0ptqV3)KzL7U z0gpp-I1)|zvtA8V7-e-o9H)lB_Rx6;Bu7A2yE)6)SuDqWDs}~Ojfk?DFwI% z3E1(>LbbB7I(&E@B7nlulhvY=Wa1mGXD@ijD7WF^y@L1e55h)-hzoq}eWe!fh9m3V{)x^6F8?ed1z>+4;qW6A4hYYj zZCYP=c#I8+$pAIVyiY*#%!j3ySAnH`tp|=^lh{)#JimWaP_rXK40A0WcsEUj`G1}O zG?XQ~qK4F!lqauv6-BL_Up3+-l1=kVfD;D*C)yr>o9>W=%mIyATtn_OBLK+h@p)j5jRAb;m&Ok?TZH-5Q)~#UwdYFp~rEE{judWa9E)z zE>135C-xMdHYY&AZGR)tb`K}s0CK9 z1!))p^ZaUC*e50t`sL+)@`)#kJ}?C_cCMH@k{f4wh~0`OFnGQ2nzUuuu;=r4BYRcI z){G#a6Y$S(mIc6B#YS;jFcU{0`c)Raa$nG+hV(K|2|^ZWOI566zlF0N;t~$jD<_AX zjnD?HN-G>xRmHwtL3BcJX7)Q^YGfc?cS4Nj=yYl5MB(uBD?r@VTB|mIYs=au$e)e{ zLHWd!+EN*v2*(=y%G1JzyQdY&%|?~R5NPb)`S2dw1AJW8O;L=p?yVxJs=X?U#-l1O zk6xh8yyY;OTR7aF{P=kQ>y`*EFivnw%rQioA-I67WS+~hVamG4_sI)(Jo4vHS|@F@ zqrBHbxHd_Y8+?8Gfq=Z1O^Fs5moGayCHVUHY^8)^j)Aj*RB!S2-FA?4#-`puwBW`` zJ_6OQj(FGo8DotHYRKq;;$4xDn9=4rgw}5xvxhi)?n?W5{*%4%h9Tg)zlQl&fN~Z1)gL(Dn7X!P428I zwA+U-x5!cQ57g1N=2bLqAWF z!&cbvsD)dvYoqP5vaQz%rL@kv*J>0AMzWAKn~Mxi5g2GlI7qvVZo)Z5oj=#O!M&*O z`3O3)uvrjNTeremC}nW@(m%#E-sITB>j-!yBM#(=FN`~c#@XjL3e)SjR9&%QO%tUg zzGv=SLH()`ZIt?Ayym;9VG1Muq+a+7Zo+59?SuRu_`k>@S4!yS3roMnq+SDO?`C7V#2 z8vHf4&0k;{kLT)fa==7EILSu3e|ZnxtFO;1 zGqP-;Xo(>_QKcYUhsi-X72BqH#7Zb-TsiNIF>G9xOHT3XoA*qX^10+#XCU0)UO4_%A_s_vO=uDd3_Q%D{OsvLMW9wGvuuRnF52{2vH06D~7N672!bIMt@it_D}& zwjZ7gV!RzZ86*wbEB5cnMJRbEqMM{G!K)bfJjyPH^9nGnrOI9S{~!dm4~P#&b*~)h zCMwM8mR+y5i~E5*JAopwZ>F`=ORfA&IF%O8(aS<}^H6wcY1g^=lYLPtFpyvW9F z3;FCS-TGFYPr#Y$ue>}?rTYrmWr^VbUu>!eL$cEdh1e>5_UDnZ@Mu$l*KVo_NDEu^ zBn*!qVnzYv>t|<(>nt8%CoNPhN!qGP|sANRN^#+2YSSYHa>R1mss->c0f=#g@U58@? zA4sUbrA7)&KrTddS0M6pTSRaz)wqUgsT3&8-0eG|d;ULOUztdaiD3~>!10H`rRHWY z1iNu6=UaA8LUBoaH9G*;m`Mzm6d1d+A#I8sdkl*zfvbmV0}+u` zDMv=HJJm?IOwbP;f~yn|AI_J7`~+5&bPq6Iv?ILo2kk$%vIlGsI0%nf1z9Mth8cy! zWumMn=RL1O9^~bVEFJ}QVvss?tHIwci#ldC`~&KFS~DU5K5zzneq_Q91T~%-SVU4S zJ6nVI5jeqfh~*2{AY#b(R*Ny95RQBGIp^fxDK{I9nG0uHCqc-Ib;pUUh$t0-4wX*< z=RzW~;iR3xfRnW<>5Jr5O1MP)brA3+ei@H8Hjkt7yuYIpd7c-4j%U=8vn8HD#TPJo zSe+7~Db}4U3Y^4dl1)4XuKZ67f(ZP;?TYg9te>hbAr4R_0K$oq3y5m-gb?fR$UtF9 zS~S^=aDyFSE}9W2;Okj%uoG-Um^&Qo^bB#!W?|%=6+P>``bumeA2E7ti7Aj%Fr~qm z2gbOY{WTyX$!s5_0jPGPQQ0#&zQ0Zj0=_74X8|(#FMzl`&9G_zX*j$NMf?i3M;FCU z6EUr4vnUOnZd`*)Uw#6yI!hSIXr%OF5H z5QlF8$-|yjc^Y89Qfl!Er_H$@khM6&N*VKjIZ15?&DB?);muI`r;7r0{mI03v9#31 z#4O*vNqb=1b}TjLY`&ww@u^SE{4ZiO=jOP3!|6cKUV2*@kI9Aw0ASwn-OAV~0843$1_FGl7}eF6C57dJb3grW)*jtoUd zpqXvfJSCIv4G*_@XZE?> z4Lt=jTSc*hG3`qVq!PVMR2~G-1P{%amYoIg!8Odf4~nv6wnEVrBt-R5Au=g~4=X|n zHRJGVd|$>4@y#w;g!wz>+z%x?XM^xY%iw%QoqY@`vSqg0c>n_}g^lrV))+9n$zGOP zs%d&JWT2Jjxaz`_V%XtANP$#kLLlW=OG2?!Q%#ThY#Sj}*XzMsYis2HiU2OlfeC>d z8n8j-{Npr1ri$Jv2E_QqKsbc$6vedBiugD~S`_0QjTTtX(mS}j6)6e;xdh*sp5U0aMpuN}qTP=^_Qn zh~0padPWs&aXmf6b~}{7Raglc)$~p?G89N4)&a}`izf|bA)IUmFLQ8UM$T!6siQxr z=%)pPsWYXWCNdGMS3fK6cxVuhp7>mug|>DVtxGd~O8v@NFz<+l`8^#e^KS3})bovWb^ zILp4a_9#%Y*b6m$VH8#)2NL@6a9|q!@#XOXyU-oAe)RR$Auj6?p2LEp*lD!KP{%(- z@5}`S$R)Kxf@m68b}Tr7eUTO=dh2wBjlx;PuO~gbbS2~9KK1szxbz$R|Frl8NqGn= z2RDp@$u5Obk&sxp!<;h=C=ZKPZB+jk zBxrCc_gxabNnh6Gl;RR6>Yt8c$vkv>_o@KDMFW1bM-3krWm|>RG>U`VedjCz2lAB1 zg(qb_C@Z~^cR=_BmGB@f;-Is3Z=*>wR2?r({x}qymVe?YnczkKG%k?McZ2v3OVpT* z(O$vnv}*Tle9WVK_@X@%tR^Z!3?FT_3s@jb3KBVf#)4!p~AFGgmn%1fBbZe3T53$_+UX_A!@Kz63qSLeH@8(augJDJ;RA>6rNxQYkd6t(sqK=*zv4j;O#N(%*2cdD z3FjN6`owjbF%UFbCO=haP<;Y1KozVgUy(nnnoV7{_l5OYK>DKEgy%~)Rjb0meL49X z7Fg;d!~;Wh63AcY--x{1XWn^J%DQMg*;dLKxs$;db`_0so$qO!>~yPDNd-CrdN!ea zMgHt24mD%(w>*7*z-@bNFaTJlz;N0SU4@J(zDH*@!0V00y{QfFTt>Vx7y5o2Mv9*( z1J#J27gHPEI3{!^cbKr^;T8 z{knt%bS@nrExJq1{mz2x~tc$Dm+yw=~vZD|A3q>d534za^{X9e7qF29H5yu};J)vlJkKq}< zXObu*@ioXGp!F=WVG3eUtfIA$GGgv0N?d&3C47`Zo)ms*qO}A9BAEke!nh#AfQ0d_ z&_N)E>5BsoR0rPqZb)YN}b~6Ppjyev;MMis-HkWF!az%G? z#&it84hv!%_Q>bnwch!nZKxB05M=jgiFaB^M=e-sj1xR?dPYUzZ#jua`ggyCAcWY> z-L$r#a{=;JP5X}9(ZPC&PdG~h5>_8SueX($_)Qu(;()N3*ZQH(VGnkWq^C}0r)~G3_?a10y*LsFz zokU5AKsW9DUr-ylK61shLS#4@vPcteK-Ga9xvRnPq=xSD_zC=Q_%6IuM?GpL(9aDx z|8d_;^6_D4{IQ1ndMAcFz5ZaT+Ww0wWN`xP(U#^=POs(BpKm;(H(lmYp+XCb7Kaw0 z;LT945Ev3IkhP6$lQBiMgr+vAL}{8xO&IObqJBEP4Y^x&V?iGC=1lVIbH^Z!eXxr@ zz)D7Fon`z~N|Pq>Bsue&_T9d;G+d8#@k^cq~F^I8ETsZ*cGOf*gZ4ghlAzW|aZ;WA13^B!Tlr0sWA zosgXD-%zvO-*GLU@hVV(bbQ`s@f~Ux=4}(@7O)%o5EH((gYflccBC@jbLF3IgPozv zglX2IL}kL1rtn4mu~`J(MMY83Rz6gc1}cX4RB+tZO2~;3FI# z@dU(xa5J_KvL0)oSkvwz9|!QcEA$jKR@a-4^SU3O449TrO+x$1fkBU<<=E_IHnF6> zPmZ7I2E+9A_>j6og$>Nih~b2F_^@6ef|Hm-K2(>`6ag{Vpd`g35n`yW|Jme78-cSy z2Jz7V#5=~u#0eLSh3U4uM3Smk31>xEh^-Os%&5tK6hSAX83jJi%5l!MmL4E?=FerNG#3lj^;-F1VISY!4E)__J~gY zP{o~Xo!8DW{5lsBFKL~OJiQoH>yBZ+b^};UL&UUs!Hbu7Gsf<9sLAsOPD4?-3CP{Q zIDu8jLk6(U3VQPyTP{Esf)1-trW5Mi#zfpgoc-!H>F$J#8uDRwDwOaohB(_I%SuHg zGP)11((V9rRAG>80NrW}d`=G(Kh>nzPa1M?sP;UNfGQaOMG1@_D0EMIWhIn#$u2_$ zlG-ED(PU+v<1Dd?q-O#bsA)LwrwL>q#_&75H)_X4sJK{n%SGvVsWH7@1QZqq|LM`l zDhX8m%Pe5`p1qR{^wuQ&>A+{{KWhXs<4RD< z=qU6)+btESL>kZWH8w}Q%=>NJTj=b%SKV3q%jSW>r*Qv1j$bX>}sQ%KO7Il zm?7>4%Q6Nk!2^z})Kchu%6lv-7i=rS26q7)-02q?2$yNt7Y={z<^<+wy6ja-_X6P4 zoqZ1PW#`qSqD4qH&UR57+z0-hm1lRO2-*(xN-42|%wl2i^h8I{d8lS+b=v9_>2C2> zz(-(%#s*fpe18pFi+EIHHeQvxJT*^HFj2QyP0cHJw?Kg+hC?21K&4>=jmwcu-dOqEs{%c+yaQ z2z6rB>nPdwuUR*j{BvM-)_XMd^S1U|6kOQ$rR`lHO3z~*QZ71(y(42g`csRZ1M@K7 zGeZ27hWA%v`&zQExDnc@cm9?ZO?$?0mWaO7E(Js|3_MAlXFB$^4#Zpo;x~xOEbay( zq=N;ZD9RVV7`dZNzz+p@YqH@dW*ij8g053Cbd=Mo!Ad8*L<5m1c4Kk ziuca5CyQ05z7gOMecqu!vU=y93p+$+;m=;s-(45taf_P(2%vER<8q3}actBuhfk)( zf7nccmO{8zL?N5oynmJM4T?8E))e;;+HfHZHr` zdK}~!JG}R#5Bk%M5FlTSPv}Eb9qs1r0ZH{tSk@I{KB|$|16@&`0h3m7S+)$k*3QbQ zasW2`9>hwc)dVNgx46{Io zZ}aJHHNf1?!K|P;>g7(>TefcLJk%!vM`gH8V3!b= z>YS+)1nw9U(G&;7;PV4eIl{=6DT^Vw<2Elnox;u@xF5ad*9Fo|yKgq<>*?C$jaG2j z|29>K)fI^U!v?55+kQ*d2#3}*libC4>Dl4 zIo3Jvsk?)edMnpH<|*l<*0Pf{2#KedIt>~-QiB{4+KEpSjUAYOhGDpn3H_N9$lxaP ztZwagSRY~x@81bqe^3fb;|_A7{FmMBvwHN*Xu006qKo{1i!RbN__2q!Q*A;U*g-Mz zg)-3FZ`VJdognZ~WrWW^2J$ArQAr1&jl~kWhn+osG5wAlE5W&V%GI{8iMQ!5lmV~# zeb3SKZ@?7p;?7{uviY6`Oz16t0=B70`im=`D@xJa16j2eHoCtElU*~7={YUzN41sE z#Th>DvJq-#UwEpJGKx;;wfDhShgO0cM|e!Ej){RX#~>a?)c2|7Hjhh2d=)VUVJL<^Aq|>_df4DX>b9W2$_DM zTjF#j(9?Co`yor?pK<16@{h#F&F8~1PG|qQNZPX^b!L*L&?PH#W8za0c~v6I2W($Jderl%4gufl z#s;C*7APQJP46xHqw;mUyKp3}W^hjJ-Dj>h%`^XS7WAab^C^aRu1?*vh-k2df&y9E z=0p*sn0<83UL4w30FqnZ0EvXCBIMVSY9Zf?H1%IrwQybOvn~4*NKYubcyVkBZ4F$z zkqcP*S>k6!_MiTKIdGlG+pfw>o{ni`;Z7pup#g z4tDx3Kl$)-msHd1r(YpVz7`VW=fx9{ zP}U8rJ-IP)m}~5t&0Y$~Quyjflm!-eXC?_LMGCkZtNDZf0?w<{f^zp&@U@sQxcPOZ zBbfQTFDWL_>HytC*QQG_=K7ZRbL!`q{m8IjE0cz(t`V0Ee}v!C74^!Fy~-~?@}rdn zABORRmgOLz8{r!anhFgghZc>0l7EpqWKU|tG$`VM=141@!EQ$=@Zmjc zTs`)!A&yNGY6WfKa?)h>zHn!)=Jd73@T^(m_j|Z;f?avJ{EOr~O~Q2gox6dkyY@%M zBU+#=T?P8tvGG|D5JTR}XXwjgbH(uwnW%W?9<-OQU9|6H{09v#+jmnxwaQ-V;q{v% zA8srmJX7Fn@7mr*ZQ@)haPjWVN@e3K z_`+@X$k*ocx*uF^_mTqJpwpuhBX~CSu=zPE(Sy%fYz&lzZmz3xo4~-xBBvU0Ao?;I-81*Z%8Do+*}pqg>bt^{w-`V6Sj>{Znj+ z70GS2evXinf|S#9=NNoXoS;$BTW*G0!xuTSZUY45yPE+~*&a-XC+3_YPqhd*&aQ>f z$oMUq^jjA;x#?iJKrpAqa<2<21h*_lx9a}VMib;a6c$~=PJOj6XJXJ|+rc7O7PEN5uE7!4n9nllo@BI4$VW2Nf_jqnkz%cvU4O4umV z#n6oXGWOt3tuIjmX*b!!$t~94@a@QgybLpQo3icAyU`iNbY~XNAArFAn$nFJ()d-U zFaO#nxxVF-%J{UB**uRo0*+?S>=^il)1m7v-u`PDy*ln%|3E-{3U~R=QcE&zhiG_c zDnGMgf1}3h1gWz8IV0Oc7FmEt>6W?Eva;J`(!;IIny}PvD?vztz`F6su_tUO`M%K5 z%C#=nXbX})#uE!zcq2mB;hPUVU1!`9^2K303XfOIVS{mlnMqJyt}FV=$&fgoquO+N zU6!gWoL%3N1kyrhd^3!u>?l6|cIl*t4$Z$=ihyzD7FFY~U~{RaZmfyO4+$kC7+m zo+-*f-VwpUjTi_Idyl~efx)!$GpE!h+in4G1WQkoUr<#2BtxLNn*2A>a-2BL#z%QO@w0v^{s=`*I6=ew2nUj1=mvi%^U@2#Wf& zs1@q6l8WqrqGm!)Yr|*``||#A+4#du6`mR^_#?CymIr}O!8Zm?(XY$u-RGH;?HFMGIEYVuA1& z`3RlG_y0%Mo5w@-_W$E&#>g6j5|y1)2$hg(6k<{&NsACgQQ0c8&8Tdth-{@srKE*I zAW64%AvJJ+Z-|I~8`+eWv&+k8vhdJk5%jolc%e`^%_vul0~U8t)>=bU&^ z6qXW&GDP%~1{L1-nKK>IsFgDJrh>!wr3?Vu-cmi#wn`;F`$GNc_>D|>RSuC8Vh21N z|G;J1%1YxwLZDD400Ggw+FirsoXVWYtOwg-srm}6woBb!8@OIc`P$!?kH>E55zbMB z8rdpODYfVmf>cF`1;>9N>Fl(Rov!pm=okW>I(GNJoNZ6jfIunKna-h6zXZPoZ9E2PythpyYk3HRN%xhq2c?gT$?4}Ybl42kip$QiA+ab zf-!EqBXkT1OLW>C4;|irG4sMfh;hYVSD_t6!MISn-IW)w#8kgY0cI>A`yl?j@x)hc z=wMU^=%71lcELG|Q-og8R{RC9cZ%6f7a#815zaPmyWPN*LS3co#vcvJ%G+>a3sYE`9Xc&ucfU0bB}c_3*W#V7btcG|iC>LctSZUfMOK zlIUt>NBmx6Ed}w_WQARG+9fLiRjS1;g49srN1Xi&DRd|r+zz*OPLWOu>M?V>@!i49 zPLZ3Q(99%(t|l%5=+9=t$slX0Pq(K@S`^n|MKTZL_Sj+DUZY?GU8sG=*6xu)k5V3v zd-flrufs*;j-rU9;qM zyJMlz(uBh0IkV<(HkUxJ747~|gDR6xFu?QvXn`Kr|IWY-Y!UsDCEqsE#Jp*RQpnc# z8y3RX%c2lY9D*aL!VS`xgQ^u0rvl#61yjg03CBER7-#t7Z++5h_4pw{ZZ~j0n_S_g zR=eVrlZDiH4y2}EZMq2(0#uU|XHnU!+}(H*l~J&)BUDN~&$ju@&a=s$tH5L`_wLeB z944k;)JIH^T9GEFlXiNJ6JRymqtLGZc?#Mqk2XIWMuGIt#z#*kJtnk+uS;Gp}zp$(O%LOC|U4ibw%ce-6>id$j5^y?wv zp1At~Sp7Fp_z24oIbOREU!Mji-M;a|15$#ZnBpa^h+HS&4TCU-ul0{^n1aPzkSi1i zuGcMSC@(3Ac6tdQ&TkMI|5n7(6P4(qUTCr)vt5F&iIj9_%tlb|fQ{DyVu!X(gn<3c zCN6?RwFjgCJ2EfV&6mjcfgKQ^rpUedLTsEu8z7=q;WsYb>)E}8qeLhxjhj9K**-Ti z9Z2A=gg+}6%r9HXF!Z~du|jPz&{zgWHpcE+j@p0WhyHpkA6`@q{wXl6g6rL5Z|j~G zbBS~X7QXr3Pq0$@mUH1Snk^1WJ0Fx2nTyCGkWKok$bJZV0*W?kjT|mkUpK<)_!_K^OoTjMc+CWc^~{ZP8vgm`f&=ppzKtw}cxwV^gppu}^df1|va7Q?@=(076-( z4KJVmu?l(aQwmQ*y_mke>YLW^^Rsj@diLY$uUBHL3yGMwNwb7OR3VD%%4tDW(nC984jBWCd90yY(GEdE8s(j>(uPfknLwh!i6*LX}@vvrRCG`c?EdB8uYU zqgsI4=akCeC+&iMNpVu56Fj2xZQHs6SdWssIF#Q@u@f9kab0&y*PlG+PynjHy`}GT zg%aTjRs2+7CknhTQKI%YZhFq1quSM{u24Oy2As@4g(bpbi%y1i0^TwI)%1Whpa~qE zX4MD(PgFEK@jZBPXkFd437aL6#COs$WrNT#U=er-X1FX{{v9!0AS$HR{!_u;zldwY zKko!`w2u@($c&k_3uLFE0Z*2vms?uw1A{AqZw^jwg$|D7jAY20j`s*l##=4Ne_K5) zOtu6_kziEF@vPsS7+@UwqOW6>OUwF$j{r4=nOSf-{UC(rEKidie7IUn>5`UoNJ9k) zxJXXEBQifng+Pte3mPQ76pVlZ<`jnI##F1*YFA*)ZCEncvgF-%)0dUXV*pXTT^L`n zL=?A5Vty#{R9W4K)m$`me~*_(&a88M?Eon$P-YdVG}#Gq4=hh#w=`>8f`9}}zhv;~ za?I=Gb3v$Ln?-SDTBow0J5Tt&xPlw|%`*VTyVee1Oh<-&;mA|;$ zoPl;^f7Q~}km#_#HT2|!;LEqORn%~KJaM)r#x_{PstSGOiZ!zX2c}^!ea3+HSWrwE z=6SJ!7sNDPdbVr#vnUf}hr&g@7_Yj&=sY=q(v^BwLKQm|oSB}172GpPlj?a3GqX#B zJko4zRRttIY>Fv#2b#A<_DLx=T@eUj+f}!u?p)hmN)u4(Jp(`9j58ze{&~rV?WVbP z%A=|J96mQjtD037%>=yk3lkF5EOIYwcE;uQ5J6wRfI^P3{9U$(b>BlcJF$2O;>-{+a1l4;FSlb z_LRpoy$L%S<&ATf#SE z;L?-lQlUDX_s&jz;Q1Lr@5>p_RPPReGnBNxgpD!5R#3)#thAI3ufgc^L)u%Rr+Hlb zT(pLDt%wP7<%z(utq=l%1M78jveI@T$dF#su(&>JkE(#=f4;D54l*%(-^(nfbCUQe)FV9non9F%K+KZ(4_`uOciy82CO)OolxisUd0m^cqueIRnY< z;BgA4S1&XC3uUP?U$}4o&r|0VCC7fkuMZBa|2n4asR>*5`zBaOJPWT$bNn(W_CK%L$c2AsfSlwq?A8Q6 zhK&USSV=^-4vZ^5<}pnAOb&IKseHNxv_!|B{g@d^&w%{?x;i3iSo)+vt^VnMmS!v) zM)W)05vXqzH5^hOWWw~$#&7HoIw}}DD3bCQgc=I8Rv|G5fM8O^58?--_-*>%Nwk)j zIfvfok0n05!w%tZ=-dpffezI7(+}yX5XhwYk#0@KW%PkR;%#t|P6Ze_K*N6ns%jOt zNeW(bRsv0BK7ah~9U~UBAVA_L34F+;14x6-;I|o=%>?sS3@dpRv|GKxilsa#7N#@! z!RX~>&JX&r{A^^>S~n_hPKkPR_(~~g>SuPj5Kx6VI%8BOa(Iit&xSMU8B#EY-Wr?9 zOaRPw0PEbVSW@Wk{8kkVn34;D1pV2mUXnXWp{V-M9+d}|qfb6F`!a9JQO_-wlH?zf z4Sn0F4-q-tzkaJ?1fV0+cJBF$f0g6*DL6U3y`Tr`1wzCiwY#muw7Q-Ki)uN}{MoCWP%tQ@~J4}tyr1^_bV9PScNKQHK=BZFV!`0gRe?mVxhcA4hW5?p0B<5oK+?vG^NM%B%NDOvu0FMq#)u&zt_-g&2 z7?z%~p&32OAUSQV{<=pc_j2^<;)`8$zxCEomh=rvMiliShS?ahdYI1grE-M&+qkK_ zD=5Hexi<&8qb4hgtgj81OD(tfX3EJSqy9KFcxpeBerG`apI4!#93xpEFT??vLt>kf zac28;86CpMu=BWIe$NOT~+Es!y#+$ zvm2s*c`J9Gy*ERvLSI<9<=j*O=0xUG>7rYh^R4bGsvz;j-SBO|P^OQ1>G9_akF}D; zlRmB@k3c5!s|Vz3OMZ8M*n0AMTiSt5ZpRy+R1|ckna&w`UQjklt9f&0Z~=->XImVA zLXizO2h=<|wM~w>%}3q1!E{oSq7LBPwQ~93p-peDq-W?wCm8NOKgTSz-P)|cm}S5&HBsx#C@Ba5;hzi#Yw@y-kC~)@u4}Rf?KV0$lPjv}} zcFpNy=YJfsS||9&!-JFjw=@NU96ESzU^gme0_oNy?})II`>Sy>bUCHs_(m&)vn^&isCl+`F~qu8elAO z)-ZP7`gYE2H(1)5tKalz&NJbcutAU&&JFV~$Jrai31^j>vZ|HV1f}#C1<5>F8 zS1RWIzM%b{@2dAF^$+i4p>TC8-weiLAPN+Aa#(bxXo9%Vz2NEkgF&s#_>V?YPye^_ z`` z-h3Cv^m6K%28I$e2i=cFdhZN?JTWhqJC{Q9mg0Vg|FiPEWDl&K)_;Bz_K`jH7W7QX^d$WQF*iF@#4_P*D36w9&iJr2E{w?LRFapwZIIVHGH ziTp*5>T{=;(E}z{1VL4;_H`BAXA~&zpeWX!gN9m|AfcJ{`!XVz48O^&+0Gd|w;udP zzU|DbGTS|7qZoEoDZEH9Kb0%DZvCaWDzuJ=8jZz}pqPn+I!c_+*~>m>BQqN2560*< z$6sx_y8WRqj$SugYGip+et$;iJ!SQAx=HgVSh_3e)MOFHuXD@sg>Yi_p8Sh`{lP=5 zo?AFv1h;KqR`Yj!8Pjji3lr+qae2|a1GmlxE*su%_V)K0Xu0(#2LcO!*k11w*V12$ z;f~i{kI#9PzvFLZ3pz@d558HeK2BTvk*JvS^J8L^_?q4q z);;4Z!DsV!P*M>F>FiF*{|p_nUgy;pDh?J8vwO;emgOAAcxrgDXiSDS5ag?0l*jj< z(khZ3-)>eiwPwpb6T9meeL)!2C-K@z9fF`0j|t@;^f5+dx86R3ZM{bnx9Hm1O$s)N zk$OvZR0u2`Z^QP8V%{8sEhW~_xbZMad2jtz&0+ekxmp;9`ae;_f%-ltk5E%)VT*a6 zRbMnpCLPnalu+1TafJ4M0xNV8g}U4Mjk{le6MA|0y0rk)is}M%Z9tUU22SvIAh7`w zTysd{Pztfkk=jD^*!lA+rBcqb)Fx`A5iaU2tl&XdL1D)U@pLEXdu%#YB*ol1N?4ti zHBQcU#_%UqiQ1)J^u-ovU@-7l?`YzYFvA2#tM0mEh3?CpyEh_NUuVajD16t zyg$C*5du9R=K~6mCJ`W+dFI$9WZZauO)p2H)*SKpHVsIu2CxfJvi2>; zcit#57RP7DpSwMF-VBm|4V5d=tRgX7RM9%KQ0JRo6d<)RmiIPWe2zh6tmswP`fs^) zwy};#jk|NXMqCSfwIR3QZ#W2`(%sJ>qvk=53CYoLmQt9q|2Gm$sB;rEuBqGJA1OUM zoyl4Wy-HYn0J6L=cad8o)R!Ea^;`rSMg9hYo3?Fw6B9dUq75a-MSb56n8~AAsS(JP zZ!1khPu}!GRpsj+jvl`N1tDD8m1myJCI3c-c<9U-1Vg`xJO~}5_wvPXYh^=Boo^|V z3Tp}|lH!9m4Ipa_$p;b8fjUd=zc4iO7vr)M&Xs0_m$fgY@+hB9%K~4*9$p0d)m2bO ze5JH`W0fnIKdcW!oO#^g1YceSQ4u->{>u@>tLi!fky)o&$h(=he?Fe_6?}O~iSf(F zV&(P~*5h>BW{3e1H%8*7#_%L1#>W97b0@jHtliES^w6w5oldI7QL+?I(Pl$DaN>~d5nXx z;CO1E+S?3E2PLq~)-?ygkHAO1m&hOYmj7?;2XM!$D^f0l9K4P{n}mgb{CoYH6RJ8o ztydc6dNqA)`CG?=Gd~EIbi`UM)eyzGF^+i?&TOdyW~mFH_^Gye(D}clDVFQ@V2Tvy z7rQIaq8Xx`kC;AO-_{k%VI2e6X@bIy^mupEX%{u0=KDUGu~r6lS*7GOeppy{&I&Ly zjOTz=9~jC|qWXznRbrfjg!1`cE!Hzyjzw6l{%>X)TK(UEGi9Uy3f9D6bbn0gT-s`< z8%$Msh!^8WidX7S;)n2jh_n1-QCtSyOAKcPQc(Xlf0*Q|5CSBjo(I-u!R0GJgzTkL z|6QdQRrUMbUO|q0dQ%+d^4)*Mjbm$R}RUcz(7|E0Bq-bAYY@)OsM<+2>}CV zzPBgeD~kBHE(Y+@l2orJrdtV7XXq_V8IETas%7OCYo`oi)+h&v#YN!Qpp7drXFS>6 z?r-q7px+(rIy+bo1uU#I2A5s@ASe01FgGMbouFkhbkm-9yZ8Q2@Q1vuhDQ3D3L+zA z(uz8^rc24VmE5r0Gbd;yOrXnQKAEBfa3@T7fcF$#QYv^00)VZPYehpSc@?^8we}o{ zlX0~o_I<`xSfI8xF(WXO-DX1>wJ`XN?4rw@}_RLD*${$}UaXL=oM(=SDMIxZj1Ji#jAcrH7nYG`r z#ewodj>F5Bf9j(j`a;>)=*2j_ZN}vf!~Hq`2Eyt;9UH1_(yjq1OUO(1M0lI3FZ2j-fU9)L59v&OiQ>5$;d!jg?Fo{Svf5t5FCZbb?)* zJN=Q!?2BztV$7)CWtG0MO~Lr4E5>aoHD5N4(+@~gQEbZTc4s3HrIl_G23PCng4Y3f zbLZK1A-x9x!)WwuI=UBkQ5QyE^&Nrw?@fsRKK41G9-xq=#VyO%CEo`{_eioDj%M!3x=>I zfOPFiFX{1t-|+3E@?UuK=0miGN04hW0=JnJrEyWw{Bg-jMvAA}cg<5LN1c5BQdrIZ z#+bxj9Jbu`11@IUjU|RKfL(UzRlVB4XT ze|(WaxL$KiRqkgCr3^Al(19!_Y7b=E(4Xm7LCO$y5+k;Fu6B#=OSzW`-7p{zRv-_) zPr!|km?8aF}+3hm)QG92YaI+jctX&5IrvTUGf{Y$)TK6)s9v!SMhU=HIpEC~2 z4>o14mG$El2sTA(Ct?xS!l*x7^)oo}|3+BF8QNe;bBHcqdHVmb?#cbS*NqZ%mYS~z z`KLoq7B#KULt%9a#DE%VTEo4TV03T2nr`FK5jUTA$FP0JH6F9oD*|0z1Yf2b5?H0_ zD|K|_5Zk`uu?ZN0U! z_mL>>F;mnHU=@to!Vv*s4;TQr9y)L@1BXXz^a85NSifPTL4h6I>+m_S3~FkXB{N?E zS<3ue_(wqaIS5;4e9{HB`Okl9Y}iFiju+oTqb)BY)QT?~3Oag7nGu-NB5VCOFsiRs zs@m%Ruwl^FuJ1b}g^=*_R?=SYJQ@7o>c9j>)1HgB zyN9LI9ifwu{Shlb6QO2#MWhxq~IG!U^I!6%5}(sbi>=bq8!8@s;4Iaun#kvh7NPwX34Rjbp2f!D)cF&sNIO%9~;C`cs&ZY2=d@c3PpN$YZjUT}X7rY`dlWX$yc znw(7=fzWapI=KzQnJ(6!o0K_aDk!^dZ#)pSTif+jQtQXga$bPApM z=);jZ5c*?*GoeGMnV0=RrZucRRYBjx>tx`A3OuY)#tp2w7mh}&kj)SKoAvbbf;uO! z?+RItUow0xc*6StuO4D--+qY!o}Isy}s;ts5aM5X~eJUZoLOq@dGv=a4hHJD<* z5q{dZSN{bv_(Vj#pFm7Q<$C;MwL|Qizm~QCFx~xQyJoCOZ$`sYD}}q>PwRZjb<=E< zAeMP?qVfM>xu2}Il2xT6={KBdDIstxY-`5IWXN zUiWV&Oiy5R_=2X9Y$ug9Ee=ZSCaza!>dWBMYWrq7uqp>25`btLn^@ydwz?+v?-?2V z?yVwD=rAO!JEABUU1hQ|cY+_OZ14Hb-Ef`qemxp+ZSK?Z;r!gDkJ}&ayJBx+7>#~^ zTm<>LzxR^t-P;1x3$h;-xzQgveY$^C28?jNM6@8$uJiY81sCwNi~+F=78qJZ@bIsz1CO! zgtPM~p6kaCR~-M>zpRCpQI}kUfaiZS`ez6%P6%*!$YCfF=sn}dg!593GFRw>OV2nQ ztTF6uB&}1J`r>gJuBP(z%KW{I^Uz%(^r5#$SK~%w1agl)Gg9Zy9fSK0kyLE24Z(34 zYtihZMQO^*=eY=<5R6LztHaB1AcuIrXoFuQ=7&C}L{c?Z$rto$%n=!whqoqG>#vvC z2%J5LVkU%Ta8hoM($p1WqN}wurA!d@#mQGU5Nb>~#XC84EYH)Zf&DZR!uY+-;VqS< z@q?$ggdX#auS#%%%oS^EN)?JhSR4JYpSgGRQZD<9!YvvF+zp0>C#$!x*x}l8U|Bb& zv?v*im5Bq_(5Wi40b1^nKun$XTST(a8yOAcqQZmKTgGLo)Ig6JuEh5J9NnqJXin@Gxzz-k6xXWYJ&@=JZw=$+ zFPGde%HsR`gI+y`rtiPaMYwbtyp!sVb!pX~;c3zLoPO0eaZSV+O_z z%9H@UhqNowzBTPcMfL6kC>LRaFF6KVaSv1R@%4}rtleX!EMnL`rethYrhTLj1x$tj z;)H!fKo08&T(;i|FT&rPgZ*D0d=B2dXuO_(Uaoi9+vEhs4%{AD{Fl@4^|`X=PvH(s zI7$6bWJiWndP$;&!kSCIR1l57F2?yzmZm~lA5%JKVb;1rQwj*O=^WW~`+n*+fQkK0 zydInOU1Be2`jhA!rnk1iRWR=1SOZpzFoU5{OPpc&A#j6Oc?D&>fAw=>x@H7?SN;d^ z-o&}WR;E|OR`QKItu(y4mT)%Pgqju-3uyH?Y@5>oSLO2Y(0(P!?_xOL=@5+R7rWw# z3J8%Hb@%Pzf^`=J6fEJ_aG6+e7>OUnhaO1(R1<6>f}L z?d@Wnqw9?^;2?q(b@?Wd=T6r_8a@Z4)*_@Q7A`+ zW3w?j!HW0KbhxF%D`9d2HpvIrBxM!36W3Yh5=8_0qYfnHm*yiLB?Ay|V10N%F9XYq zanaDtDk$rS+|_H_r|a${C}C7b{E)Ii20-a?Grff$E?&|gWF<#Ern2GqhCiS0~Y%knIi8zY^lE4qLaR-3M;_Rkz(s;wu z9207W1PXIe#4h4Zw}dvdV&FYcnUlD5_C4hzJ@bPSBVBLpl$&52mi+wwH;svyVIzAB zoA+NQ;Hpqh?A}^Et~xhl>YQNQwh20!muW{ zq}|Pg3jHZWnDBN?r1KhiVG$%Sm-4+=Q2MZzlNr3{#Abqb9j}KK%sHZj{Vr2y4~GIQ zA3Mz1DjQ3q(CC~OyCaZn0M2!){)S!!L~t>-wA&%01?-*H5?nzW?LJB`{r&)vLB4!K zrSm({8SeZ0w(bL9%ZZAZ*^jf=8mAjK^ZR0q9004|3%73z#`-Npqx*X^Ozbja!C1MW z-M~84#=rU1r>p{+h9JU<#K_x$eWqJ+aP%e?7KTSK&1>dlxwhQmkr69uG~0iD@y|L- zlY0vSR2|IhZoS6PpfUai_AhKo2HfdD&mhv#k51CX;T z*sU)XbDyfKjxYC$*_^(U)2-c0>GJ(zVm$CihHKlFSw&1A$mq$vsRt-!$jJe3GTaZ6 z3GcVvmwZ0D>`U+f3i*pQ>${p1UeyF~G9g~g-n{ThVOuC#9=ok`Zgz@qKCSN!1&P`N z=pdlGNwal%9;)ujwWH*#K6CQG*fJDAQiKlO2vKJHeA1lj&WQC+VU^@ea8$#~UOX$*Q!V^8L- zL0$W5(Y3=??%&j_WUq6*x>=?BfmI*d8fmDF*-!XVvxL8p7$r+}Igd_(&`|D*;Z#GE zqm{tHx&aHBpXw&~l6>7-FlyiSPJtTJblAjLU5Ho$FeN0mDguFAq?r+6^~o6|b+rfE zGVcZ&O-X~tE3liGcdI~hHSCT+&F&uH8rr&f{6pr^1y5061`fu~=^_|Idrgti5+*U7 zQOb9G?Rz$j-G0Y}x+i{HB0!4ZmKzykB<0;Rbmo2)T4|VdcwujI_otLG@@8OOKg3kw zP|0ST0D4@zT?O=(0Pikp)Rpwxw_VsmW4!^j^sFd6r5l zw}SG_HQPs>ae%Bq{sye_SaBX%|F-}&^)Wz@Xi<)YNbO?lPs7z@3c;$b^Aw@>E%mOj zW^c%IdtC(Kk@s*}9NbKxEf8SZtP+32ZTxjnrNWS7;W&D~ft{QY?oqOmxlV7JP!kW!Yj`Ur{QbbM1h=0KMaIAmWiISb7TKd4=gMeo+Tcz2>e#NihnOV%iNdx` zeiuoOK^{}D+M+p(Y7EC=&-`$B0F< zQ=zHaM;&QQR4jM$sG=N&sqOvD_Bx*drQ6c@u0()g05cwl`Xm{!S_Nuaa2KlL*rmmk z51yPE)q?Bl$sNM474Y!=zZ zc{EVGpdJ!Su{Qq%llR5O6#zK8l(ld*UVl87@|iaH@C3+*;XBxjEg&fsQrzpMo3EEG zv*Tpms7a;7!|iz8WY7={0a$0ItO-(ajXl;wX_$$yzEF5k9nc>L3wv!p{8h2)G0W?h z{v6vH=7+>$Ho^+)9hDtCd+S_yh8pzS9$)hYev-=eDu?lGIR;-fgz+dr+wcmM-^dZp z9}`&kAf$~z1ovF)>Hgxc!Xe3cju-jQRluCm;c_1=PYQygb?Oxe z!QG0L3sT_k=WpfOPL#|EPlD^t;ENCC39O?tHd<(kfx7SOcxl+E#;ff19_+{vbkZSvbS$I{#>31KZj^$n%ayX0jj}EvsgnHg16P z_A6Y)pdp>kLW<;PtR*Vs#mVb%)ao7AXw{O&hBDmD;?mc3iMH;Ac@rZZ_BQa8CQ~|0 z&d1L{in-z--lBO|pxqc%bqy^~LAGv=E*eaVU~OeuVV{d`Vv#-_W7EYdTDzVraG9H+LC_dWcgZMn~KcP)XvKWbcr5&d+=a>{*(Ha6Y1$==bR z{O-?$7H;`2dt0B%Vm?6`_?ZOjJkyu9ZJsh^WH*+es&^@KDcR%Zej%3PJ*XovgyhTbaH(!H1H_OF~=*f55Jr8A%uW zz5IoAB~1e2-tDGp9}`MnavAMy?jgPM5F%y`%$}dFLrz_* zIrO=afT8+AkK5B1s3{ZDVP$g6y$-*U*=?-fh!cNyn3q6YhNhfRxW&GLIJ2#>9bYMD7-F%{|Iw%@a=DoAAU;3k9p$`V zImKm{5HU~wq|nQFwab)_7lNckW#1z2$|oW5x7vDbBURVjw8674P?L1ogMKpHoV>;# zO%*1OwI|($UOr#hL(*M~qsn3PF%_|15uc%Hy9@D>_~N|?<%lig6yKX0a#1s$o(^Laj8bF#5fGPOFMGmMiUaxSwE}Qf#SG_f79d2Iv=TFBXzTpr$^avJ?=|arh2<+ce}&248Kw0} zhlva`wD6X~s7|37la4FnFOgIHhBiFo`lw~?lSbk{>)P(3jyVhM4O)a=GX3(sW1vIC zz0mJ>;J{!eN5#nf2>$u=3Kq>`7u9QnChi8>CjONBN-b+W_UQIuN#{N$Q<$}IOvpQP zB&5ZrY{V&D=4)voh;6<1U`PFA>V%XUW73S9D^J>cQYfzIyIV5i35WNb5K9c^|M}=* zN_C3rnjCZP1^v{;EaGK7Tp5z~B#?f5NZaAsFUOLK)mI~bJTaL8DF_eRikE{%^J?y9-n_U32EKHPCkB^ZN2*zk{bC=GM%_I z61}nkr+Plg6S0V=mY>H_KQU&)P~=y3$#$*U8FunXkb_e1O-7t@m$5re%u!_G%^?_| zRIJzg+lX$}+ba|qx)Ec6c^ip;`_QfQrD~SPa4MoyRUOtX&~^XWcO^a}KBkXK9J{ZFOA~rovYa0!7btTC*=xNQrwJ)$Eu`TT$;%V&2@y@$ISdNn ztbM7|nO+U9r;ae{{;QiNEYpe4nrFq_x3 z4Tvf^b(I@_3odwhVe!aC0X&~inrYFu# zh)+eF__8ly&nLr4KlLWl%B_ZMo=zCH2QfO^$lJ zBvU*LQ#M(5HQ}2Z9_^y~i@C#h)1C*?N3v68pY+7DD09nxowdG#_AAM5z&*|-9NcB{ z_xKUY>Ya7>TO#Bat}yM}o(~8Ck^!QHnIj8N9}c*uyIs}IEqGn`xP;q3vhW6gsqUe>`m1 z)~ad@y1=?H`1SNl?ANCs5ZD`8tG&Hi=j|R%pP(%gB8pd)Q--E?hWU@)e?>SLV4s(- z!_I^oVC0x97@I(;cnEm$ttKBnI3gXE>>`K?vAq~SK?0YSBsx{@s1ZdiKfFb|zf}ju z7@rJb3mC{U`$R`YS(Z#KyxQx_*nU`kf;}QL%bw17%5~6!mMao^-{FFmX}|ItFuR~F zAAvTF%f4XKYo>2-PJ~ro@Ly#t@Sf69CrA+rmMRpihqH7V&SXX+$Sw`HZF`I*_3Vjz z%kPMyN0J3sl>X{-h12)j&XRhAAI;Aou%%z}gI>G+32z*qpZg{m`CezFrzg#&yc<1` z%j~}PN!F5Ddq(>R{+t0v{j6v^0XwWGu@5+`-$m`_>pCzM`r}wz*8Qv=$|P0R$%tJp z>D+N4GZ|Tg>XL<6XP9_wQRGDs^1icY*5GP4>*7mGMr;V zI%kT_^_SQml6$#uRE4Ps>}?ES)_XI8m-%GN{o^itb^S7e_bM$-wo_Ws)W? zx4_6#*X;T$n2N==N0#xzb~BQU#%^NF6|~898JGDbQxjK(ex;Q}_Qn@?Y>!kkUYUeY z&VclG1#eDPU78K@^p3tAUvZi1(nFfk6AAVHWt)Wbi7dPbjA4isOY~?*1&asp!wg#Q zSpSI6*!TGn3|-%vuJE<9V_1EKkz_0%z}Mb7;E!uz)+0^k;@x+<5tzj5 z!InbRtc`YwNCbCac{plY&Y}hWp#PC{o@5UsBj#tv3f^ns^`;$MVN?>q!pW+MYeC7= zkWr1kAX(0xVQ<{qny&CO*|g1{Mk_yE>1t}_YT<5#p8P7QXf;o|s>XQ#SoA&!ddE+8 zOM&VsxsRGS(Spli?P$^pK7Ty{v86RP_6h|MU^J z`J>vn0|BG3Vf!uR0zM|GwtiTPZNb;a@@1+V5+$P4GI_&$%6m!YRGL=lz5kh?z#5f55 z76COi1`R(5p69;ThuQnJ$R3w?I?jigai2arApagd=^tT~oMUWp^u|H_@zXBjpI)Dv zEFc^_`mVu5U*;ClT?x-t9{#fto_+92GF^dotz0sFWTDwZ`s40AY@mv+Qh5c-Ts8Zp z!(v7!zPvFhUZ-xkR!IvaW`{PqN|k)L4*anbtmK+UU&K*awl?DhxRalbtmDw`$#VzK zYFaG}?$F)1j`Qx7wbn|XzMJ&g@3Ai#u5M?%CLPghk;lD^)-|21{Sr+M(suBU4}6CMTMxc_tD;X;z<1-{FeHte=kh1B9O6Hl z!v2i$d1VFC&z&58zU0`G#7^K3Cs@9LYN16O%Vz)?-iQL!G6&sg6aaX>DBZmm@lFrRJpcL{K3(;+`$9GDFDw62Mud@LZjabzVC=w$dx>TQa}U z-{dhKYTYx*C=Fio`ez@wrzx+p%Fk3i&v?6ENXMb3p^?;_&huLLueDwr zpRqHbU%i;9TmexFxCS8F1rPo-ea3!}!ew7{(($76Rdnfa`~$9{8H@f7U&0&HjZ3TZ zuBc||%FljS_e&wNZ$1ezT$*})XAfm??$_cY_?13vM^tT0EKY2ptb+v5P10}a%aTk_ zh8@_T{ns2@jTFhv`)-Vxh}u(0DiL0MUi(We_eic$;gCoqj(T_S{jDo^PahnKJUp3@ zMOk+%weP*c%K6VFXR2icY`J~-&fVMYUg6fsFI->jlA|9`+07y~$Fsz}^;w;mNk$ms zu?y)VA@QH__tvYDudhEWuDD20H&uvrf_boY{($?5{s-SDjyRxSC%%2Xs5d2dpjdk$ zU*NURD#ovwIfd^H{fXR@UuaooJtQr7$d0+(K+1UEwtG9_T?sb$ExV$e-bpf}a@YUe zuzInI59w!x;<)>Be;a7ukLW>V=8~J6nKU<0@H+SQ!Be;1Za_pw#hiuW_PMPBo8W2G z*WDtiIAN<>HQOmh)DMi{s-0H^GmV3QMf4Zu(zXT!-c;2)uv4gUwt(-}-N*|KUOo$h z+Ak^R)h8yB5UD8 zsSjHgY}KguNi?xV=tdCWqJR!~dDpFQoRJOwxrWH^vfRq4%)v;sDfIjsLXF^)uy>!i z*S8Njd7yfa`+7(|8H9j73Rh|TwFpF(8H-p;RLLIU>k<*qI%A*SL{u$%<=X@Jm1QFe zVkQ(X8P4Tohl?_tSO__^aqaI?k$CC8uNLv2mp_zD@4oDaZfEN5;3#XY!L{8B!;Dtt zb~Zge@JF|#Gsk^5$-|(OPI73po|WZh<`UxaH#Y2!&p05Ph?H)d3Bc3J4sDi$f(6K`?&D&~eHVuE@_Prkt>_&8&aq=OzoN!ANkvho;qIX(g|d#EKQbJ@;-%_iARmgSF1fEK z@B4W@5mDME7AzfL**c&2#B7xO9>rA4x$rM{N=%0=goumK1kL{TF@CSk0yvqR2oo&m z)?nyiL$9~Jt(qnEuWt9Hc_duim%|zJQYiaF*~orVNDvJB;`%ZW_2x%Uu01LeX-JP& zD&fas6d3=igAgcfeki79{5!XPHHYR#nfLYRKv^wkv~cnEbLHMwQ8%yCZI^rK!D2qT zk40Vg;e!_!3d56&umIuidN?6MTZFzHot}AdqKzDh#w0s`)cV!2A74RSH1@lDXtC38 z+UhO4A9?oZEOV{bIgGd1{2qMR&xT+}q!=I8m)W23v!W2WPC?Tf!F!e%_(m^lQZtq* zYwi}gY(KZ*Y^OWRNj$Ph#uEEBM+wtN8QFQ@^`GDOln^ioNrmtvzNNi*qS5lPHxI96#sMil*teLVaa%$msF>@5p#SjT%q8|<4ZOUB#!-kG+|eFSED z!|3c8fXaym9qH`L;pmqTWcG}WE$(h1sZ3seM>)E3ptoP<;~h~qe6XA)lGVanf&->P zjZwi;_;Dt+bYdAeD_XSQ-DgXRXqLv`3Wcgl}myA-JlzBBIh zWq4Q*9#(zjAk_H8VS_AJ`?OS*^gB-rp|~qt;v(C5ef=SErv;~zL64hW`#g!UZQcvZ zF6Ra@S@YhVSkSWVAY=Z1w)w-hfJDRwKTUH0o-OG5TlW0HDH36hIjnP=?A+8u1)Qyy5U8Gi$! zt^!vy|f=YHfQ`ZRK?D zXXn*kItRg50vr2+_hV5kjOleg#s~z(J2p#`=1Tq4#JS`MC^e4p&s7Ir=3m(K$LW#` z=ULCoWtna!so+QQ*JHb~6Ps9_&Ag>9qsUskp0pKbi`n?(u3&@QT!?}N}rXn z>1eHi6(@LicU*AR1obe+nbzTCD#VTJ`PFLRT(nc$NWrhsgRwFni*D(#?W^x=J6?|b zENSc^D}s>Y55)PzFs2d_2;yh89E0ZIgs&>6JV=pL6k9g_(`$04EoY+Zjn}}8e#n83 zJ=zB>BU<253Erdo$wE4^+@QQJFZyAj#(InFlN;!UGg96R@{Y&%OlGG;dM)^X8=Ddw@&2Vx?zui$tO z-{zgaU7&F!xs=e`Mn}r+xrdIAmkraRN_7P1?qu1|TZ%1QR(Mn?k+pq`Xys2v9Gs=a z?r@g&;UKcM#?36r9k*eVD(}9qe8?irotsn0+eHH8*4 zPX@Lusr)$J%8jarx5ssEJ?twFyu4kAbrf`96_z{6at^&UkyDzFa69RXP>PeK+dAWqE5<5P+aHa zs<<*+OO_2ObTXau%y)Nn{(p5`XIPWlvi|asjYcui;E@)Ig{YKBXi}spqC!-P5owwL z3L*+9;0C0G!xoN;4KNfDaElv>1#DMDglI&MAVoK2+c2Pr8&sl*1dYj=^>NRS`{O&%YV25@5*eoOvpD_(xdKsnqb^`T}bm;n0BN9ben1Ynyi*OOf;qLpf^ z!T{}GzkXSszN_Xqzp>}S*Im)_Y8~2|B*ybw(U=Q)5_NcMkT;)1&52YQJB)Tn%kPK! z@3;^AI){B(&UOv<{v9KKJrInkdcXV0%O1%1=7vYV*j?v(Kp~arZio$#(A@$kYB3aM zRdm4!^Je15%66($EkCIWGhi@=kNAyLJ3ydlJnCpPuxH0+OA}J)+t8d7nT->##Nz4w-L=S7ExQt=Rx}S*mpT91(>t~qe7tM%e|O)TIO^dP zfo61GNS=cJbLutqUh84?7X#bq)bv57s&D_zm{+xNv7vHjb=_}j-Lrj-Ss*pcD@ts$ z)5Dol8Z_&*1@JdAQE7SL$*!TXI|YE7q=YGkIiUeLvT0)14Q-ivs|+cqeT6DTi9eQ)h?Pu9pqmH51B* zFMd|;l2@D4*56|EhMFlDxl2i<8qq=c+AhMYS3(A28#3DZ;_Ln>RA3q#IAdJq7M#N> zTZ8t=_>lq0=W&w|bdQ^sy&m^@KR)mNi3|1<6|OL(0KLtP#I6ix$2b{-Y9GP5I7 z8AJUSCnlia5vWawX%ZLWTC2UV$cn^sfv68W!6)QO;ZjnX=7#`$ZPRG~irfl)ZUJ^D z{lUk?(*SU7XIiS^H{Lpxn%542#PgxdeG)Ociej#(uvX)z;Z3)<16Yhd z-sv?qQ5D4a)ZYoYPRep2Zvom@U)HKq*54ZEwdaEq^FZG#(CyG!=Vw(0j8CCmP~`_z z=OR^i&WkDCf2cLvWm@d?)mEgme{hA(o#xAL023LZ3(82SGRg6jJF7$kZ4! z6*FTm4y6v~CP!3$+fxg{QeFo24<3iucgI!oyjV|9Dsx}r~4X@lt^VaH$u zD?87}1Jh=?G8OYg*ts2k;X9{f*Za?yu8IUUfyuQ**wbcWT+KncjD^qQ3h&w2+S(Mj zZM~?Ot%ggTIHwkBkL-4&jI5R=B+MCOR42bKzC2M>l?1%x2Iv7amIfQ1B#wwfD`z|m z+E?G+o(tde*Ws?;Wo4p#Yy>Nnf|*b<nj@-s(rZ)-U@ z(Xe(qZ1(_dH|J3yWu|bAPINK}DwF(kZ>FKx(?ZmU^KFC6*bh$;FKGh~pH1 zozA+kgcIk9@2aAwEJ=VYizT!sxDXX$N?XDiGKaaT-OU@Ib=~4DmgEk&{2D@IvyjF* zuF@sDcuuqx_FAgx;B@@8gqjMh!kQeEKA*y4+q+^4&uc0|>M;$Xb+ z@X%eUx1m%$WSP}Qchx68NQ?dO!h`6;Quq+A1(RORsQ-;6bZ90vj#^0(7>cLR+-_;9 zCd@b~B5V>$tpjkQU#BD%9^zu7-l>U8nzt+XuX5cYDCHYaX5t~~3?lpa;)Mr>q;5XW zu(Th;fr}-GkP`K)u97(#UB|L3f;H7Cd#Pox+auV`=m?a=mSv1v)(V!E=$%gkIJZ;` zZj{Lb@bhs%bRa znZw9cD$cDFVHPtpXwY1K)wys@LS~;!qdqkR>@&RtP>?M^>xe{4N#EtZy4zZ5Ar$ZF zV=X=(!xin-58MC<+b~;jk8Q|3B3THGIA$cM8Bg)Yd6ygP#i?4VrX3OvP_k5i{Cppw z-{$XwrJ-+X$ccJ(Q{|?T@U9=-?qlsfA43%8t247KZn?`+C4e`b-e^(df*iW66=Oc2 z3w9UhohfdY@pH1MZ}vc<1osV(2CGG)Ree$E-T;8>$zw*>x-505b&4(shMGIjbAfLS zEZ3ys(`SmCWc(75)^=aKer}>67qj^nGKtCK{35I|tA}wQa!uM!suX%Gb~ylORGGc( ze^|m|N!}G0#Ph|;wSXz`SByQM>lPM#8>mdSQs`7RxkXaSAADYA24u6xWqkIXY?o%z z%TEFL+wNW^&nrvaA1_#P%&Hbzrjl!*hIft>F0@g0IVydUU4MJgS3_3Js8{*>|G2jC z4%n#cOy9b2Xf&Pw=14;0Dtf00C^Z$I-v05OqtvN9>sAC&oV1Tk;;ku7VR`sQK4oFq zQ8)yoZNuTwV$t13|GCUIC{ID_r7M5&R*zhsxbrkg;EgMtL|9ne=^}BM!dxV!KDeXkWA^MfQTkQEt8~t>JznNh%ULvn@dbQ2cyf} z|C%ns#NJU}SHU(7Pg$<&8uDK>d5GZJ&`;CcfGP(~b-#UusXevc^q!km1X6_wVMqGk z^m&ZS6#42?p4c_t1TA$_+}h1L2c<<=$k%;v+D!<@j5hs|{>d18>~~v#oq4yGyS@QP zgTX2oJbEy@eJbo-f{ZQ>-nmB-#AqWcHbMQXFi*T)0n!(HIexz=pp<(O*DMh7CMupX z)ei1ZYuIW~E={-ND*nD;okiZdm!?^|LjLZhs*FHZvWld5TDj zcvWB)`-1Me9bu`*4M=CO6ye=pMgxlgYvsh2rV#5Z$hFKw0GX30%oufb=hJ0BFIJH` z+Fii4gQ+7!)8K^yc*PVEW^#f!|BW0Q5*`IewQ5YDFh?{x1L7tlaUAX@3Y+D>6FPVf zJzOGex~H34`8eq+TL$FsHm+27RS>3$CG;>0Jj4*1ukX$za})*b^S5p}I2jbFCHLsA zzYwAyftMz`uo2c8ieQcy-p&9iP3fMk(uRw+OlBPm`KCLei6g!|Vnk*-kjs>A25MTE z5GLDMV$70AC0j-tx*0sCruvKh{fSM)3X}13U>m|KeaOb`9^}v^44!$`06-JHf@L4EKyxV)M!8cL zi5p9kF97RiAT92!e?%9CP=qX3wyv^A8q!w%07d(9f-U))uDgsr4FDVL;|%r)fw}-@ zlB$F79X^EKYF%8J7mU?3VzJoYQ0<;NczW1jH4=4kEh_)q|^9wj zIsn-SsmRx0_EJ7(6WypwptIwZ)-T<__UgUu?BXt zoIf|a!5`?&JEb$w2PZSqhA>J;GIA^rJ-Cpz8MKX~bcqZNOUzPtu|NMvEP>+cO;V*W zNQ8YPENkr!)lN+tlxB79RUD20$)+_P6Jc`+4q@%Kno{F+#1qR*zrj%T>nTSceO?a5 zyqGDa59#G6k*RXu6+#=e=e!~i1Y&15!cHmE6sLh_K%Ppv$tFE-Le3RQs-nx5LB>gy z5A))kwkxWSy73{@I{%{DY8X+2o{CLJb~R$3r=oT^P~Xo$2lKz8?Z!3QLn$5l#L2k2 zb1=?UT&c<8!&9gW1M&jI!5%dhJbD3nQXpaeNJ>=zR+EL!4iY(nMBQI+|2J+Hw-WMr z08Mt9h8(PGbY?zKtk=cqw(yW}1A#htn* z8&}5Y>$uc>Lv!bSuWQ5UB&ct7*jiZAFpxz|%xO&5kg zzlf?6xy7H3G^*wvP5scW*Wf(<&eP!YIUf%&HT?K)RWmKg$G^=mSoi~;&9dU%{o}WV z#BX;9+q)fpVU`>Vdo~AtYK)`7z*H;dc-e|q6Qt;3J0APUL!~g&Q literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc GIT binary patch literal 3276 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 N;OXk;vd$@?2>?>Ex^Vyi literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d GIT binary patch literal 5933 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 f$KZHO*s&vt|9^w-6P?|#0pRK8NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifbFy+6aSK)V_AxLppYn8Z42d|rc6w}vOsL55 z`t&mC&y2@JTEyg!eDiFX^k#CC!jq%>erB=yHqUP0XcDOTw6ko}L zX;EmMrq(fKk*eygEuA616;0)>@A{TK|55PV@70 z$OfzS*(VJxQev3J?yY?O=ul(v`fp}?u9z`JK3ugibK>)DyCwImZOF4d{xK%%Ks1*} zv$oa)9anR%lXIBUqYnhLmT>VOzHfNP?ZwJNZ!5$s9M08RynIvaXw>@G^T9@r9^KH1 zVy??F&uuk)bH9Y4pQY!hP58i_H6 znl-NcuCpLV6ZWU;4C zu@9exF&OZi`Bovq_m%T+WhU2kvkz@^_LpycBvqm3bMpLw8X-Or5sL>0AKE1$(k_L=_Zc=CUq#=x1-QZf)G7nHu@fmsQ1eN_N3+nTEz`4HI4Z6uVlE zJH+X&det8JU?tO?upcM4Z=cV!JV;yF>FfL5Q$M|W_2Z!P`S=}Wzp|_1^#d%e?_H`> zV@%vA$+bFVqhw9`U;TfP|5|PD{||OiYdor8P*i??|NJcb%kzT_73*7WE?Ua5hAnR2 z=7WE=PhTlJ#ZeRznjTUb;`E(wkMZrj4e|Hilz-mK>9cZHQY**5TUPw~u}k;u73KI}xAx!0m-)GVia|x^d3p~s_9gh83jA&Ra<8rM%`>U3x69t&NzbwWY}7Ar?)FK#IZ0z|d0H0EkRO w3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Gi$Dzwp00i_>zopr02+f8CIA2c literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/packages/firebase_installations/firebase_installations/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4 GIT binary patch literal 14800 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/AppInfo.xcconfig b/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 000000000000..cf9be60ca471 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2021 com.example. All rights reserved. diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Debug.xcconfig b/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 000000000000..36b0fd9464f4 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Release.xcconfig b/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 000000000000..dff4f49561c8 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Warnings.xcconfig b/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 000000000000..42bcbf4780b1 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/DebugProfile.entitlements b/packages/firebase_installations/firebase_installations/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 000000000000..dddb8a30c851 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Info.plist b/packages/firebase_installations/firebase_installations/example/macos/Runner/Info.plist new file mode 100644 index 000000000000..4789daa6a443 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/MainFlutterWindow.swift b/packages/firebase_installations/firebase_installations/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 000000000000..2722837ec918 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/Release.entitlements b/packages/firebase_installations/firebase_installations/example/macos/Runner/Release.entitlements new file mode 100644 index 000000000000..852fa1a4728a --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/packages/firebase_installations/firebase_installations/example/pubspec.yaml b/packages/firebase_installations/firebase_installations/example/pubspec.yaml index cca9e205effa..aafef8039b1a 100644 --- a/packages/firebase_installations/firebase_installations/example/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/example/pubspec.yaml @@ -1,12 +1,24 @@ -name: firebase_installations_example -description: Demonstrates how to use the firebase_installations plugin. +name: example +description: A new Flutter project. # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + environment: - sdk: ">=2.12.0 <3.0.0" + sdk: '>=2.12.0 <3.0.0' # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -17,18 +29,13 @@ environment: dependencies: flutter: sdk: flutter - + firebase_core: firebase_installations: - # When depending on this package from a real application you should use: - # firebase_installations: ^x.y.z - # See https://dart.dev/tools/pub/dependencies#version-constraints - # The example app is bundled with the plugin so we use a path dependency on - # the parent directory to use the current plugin's version. path: ../ - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.2 +dependency_overrides: + firebase_core: + path: ../../../firebase_core/firebase_core dev_dependencies: flutter_test: @@ -46,7 +53,6 @@ dev_dependencies: # The following section is specific to Flutter. flutter: - # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. diff --git a/packages/firebase_installations/firebase_installations/example/web/favicon.png b/packages/firebase_installations/firebase_installations/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/web/icons/Icon-192.png b/packages/firebase_installations/firebase_installations/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/web/icons/Icon-512.png b/packages/firebase_installations/firebase_installations/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/web/icons/Icon-maskable-192.png b/packages/firebase_installations/firebase_installations/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 zcmdT|`#%%j|KDb2V@0DPm$^(Lx5}lO%Yv(=e*7hl@QqKS50#~#^IQPxBmuh|i9sXnt4ch@VT0F7% zMtrs@KWIOo+QV@lSs66A>2pz6-`9Jk=0vv&u?)^F@HZ)-6HT=B7LF;rdj zskUyBfbojcX#CS>WrIWo9D=DIwcXM8=I5D{SGf$~=gh-$LwY?*)cD%38%sCc?5OsX z-XfkyL-1`VavZ?>(pI-xp-kYq=1hsnyP^TLb%0vKRSo^~r{x?ISLY1i7KjSp z*0h&jG(Rkkq2+G_6eS>n&6>&Xk+ngOMcYrk<8KrukQHzfx675^^s$~<@d$9X{VBbg z2Fd4Z%g`!-P}d#`?B4#S-9x*eNlOVRnDrn#jY@~$jfQ-~3Od;A;x-BI1BEDdvr`pI z#D)d)!2_`GiZOUu1crb!hqH=ezs0qk<_xDm_Kkw?r*?0C3|Io6>$!kyDl;eH=aqg$B zsH_|ZD?jP2dc=)|L>DZmGyYKa06~5?C2Lc0#D%62p(YS;%_DRCB1k(+eLGXVMe+=4 zkKiJ%!N6^mxqM=wq`0+yoE#VHF%R<{mMamR9o_1JH8jfnJ?NPLs$9U!9!dq8 z0B{dI2!M|sYGH&9TAY34OlpIsQ4i5bnbG>?cWwat1I13|r|_inLE?FS@Hxdxn_YZN z3jfUO*X9Q@?HZ>Q{W0z60!bbGh557XIKu1?)u|cf%go`pwo}CD=0tau-}t@R2OrSH zQzZr%JfYa`>2!g??76=GJ$%ECbQh7Q2wLRp9QoyiRHP7VE^>JHm>9EqR3<$Y=Z1K^SHuwxCy-5@z3 zVM{XNNm}yM*pRdLKp??+_2&!bp#`=(Lh1vR{~j%n;cJv~9lXeMv)@}Odta)RnK|6* zC+IVSWumLo%{6bLDpn)Gz>6r&;Qs0^+Sz_yx_KNz9Dlt^ax`4>;EWrIT#(lJ_40<= z750fHZ7hI{}%%5`;lwkI4<_FJw@!U^vW;igL0k+mK)-j zYuCK#mCDK3F|SC}tC2>m$ZCqNB7ac-0UFBJ|8RxmG@4a4qdjvMzzS&h9pQmu^x&*= zGvapd1#K%Da&)8f?<9WN`2H^qpd@{7In6DNM&916TRqtF4;3`R|Nhwbw=(4|^Io@T zIjoR?tB8d*sO>PX4vaIHF|W;WVl6L1JvSmStgnRQq zTX4(>1f^5QOAH{=18Q2Vc1JI{V=yOr7yZJf4Vpfo zeHXdhBe{PyY;)yF;=ycMW@Kb>t;yE>;f79~AlJ8k`xWucCxJfsXf2P72bAavWL1G#W z;o%kdH(mYCM{$~yw4({KatNGim49O2HY6O07$B`*K7}MvgI=4x=SKdKVb8C$eJseA$tmSFOztFd*3W`J`yIB_~}k%Sd_bPBK8LxH)?8#jM{^%J_0|L z!gFI|68)G}ex5`Xh{5pB%GtlJ{Z5em*e0sH+sU1UVl7<5%Bq+YrHWL7?X?3LBi1R@_)F-_OqI1Zv`L zb6^Lq#H^2@d_(Z4E6xA9Z4o3kvf78ZDz!5W1#Mp|E;rvJz&4qj2pXVxKB8Vg0}ek%4erou@QM&2t7Cn5GwYqy%{>jI z)4;3SAgqVi#b{kqX#$Mt6L8NhZYgonb7>+r#BHje)bvaZ2c0nAvrN3gez+dNXaV;A zmyR0z@9h4@6~rJik-=2M-T+d`t&@YWhsoP_XP-NsVO}wmo!nR~QVWU?nVlQjNfgcTzE-PkfIX5G z1?&MwaeuzhF=u)X%Vpg_e@>d2yZwxl6-r3OMqDn8_6m^4z3zG##cK0Fsgq8fcvmhu z{73jseR%X%$85H^jRAcrhd&k!i^xL9FrS7qw2$&gwAS8AfAk#g_E_tP;x66fS`Mn@SNVrcn_N;EQm z`Mt3Z%rw%hDqTH-s~6SrIL$hIPKL5^7ejkLTBr46;pHTQDdoErS(B>``t;+1+M zvU&Se9@T_BeK;A^p|n^krIR+6rH~BjvRIugf`&EuX9u69`9C?9ANVL8l(rY6#mu^i z=*5Q)-%o*tWl`#b8p*ZH0I}hn#gV%|jt6V_JanDGuekR*-wF`u;amTCpGG|1;4A5$ zYbHF{?G1vv5;8Ph5%kEW)t|am2_4ik!`7q{ymfHoe^Z99c|$;FAL+NbxE-_zheYbV z3hb0`uZGTsgA5TG(X|GVDSJyJxsyR7V5PS_WSnYgwc_D60m7u*x4b2D79r5UgtL18 zcCHWk+K6N1Pg2c;0#r-)XpwGX?|Iv)^CLWqwF=a}fXUSM?n6E;cCeW5ER^om#{)Jr zJR81pkK?VoFm@N-s%hd7@hBS0xuCD0-UDVLDDkl7Ck=BAj*^ps`393}AJ+Ruq@fl9 z%R(&?5Nc3lnEKGaYMLmRzKXow1+Gh|O-LG7XiNxkG^uyv zpAtLINwMK}IWK65hOw&O>~EJ}x@lDBtB`yKeV1%GtY4PzT%@~wa1VgZn7QRwc7C)_ zpEF~upeDRg_<#w=dLQ)E?AzXUQpbKXYxkp>;c@aOr6A|dHA?KaZkL0svwB^U#zmx0 zzW4^&G!w7YeRxt<9;d@8H=u(j{6+Uj5AuTluvZZD4b+#+6Rp?(yJ`BC9EW9!b&KdPvzJYe5l7 zMJ9aC@S;sA0{F0XyVY{}FzW0Vh)0mPf_BX82E+CD&)wf2!x@{RO~XBYu80TONl3e+ zA7W$ra6LcDW_j4s-`3tI^VhG*sa5lLc+V6ONf=hO@q4|p`CinYqk1Ko*MbZ6_M05k zSwSwkvu;`|I*_Vl=zPd|dVD0lh&Ha)CSJJvV{AEdF{^Kn_Yfsd!{Pc1GNgw}(^~%)jk5~0L~ms|Rez1fiK~s5t(p1ci5Gq$JC#^JrXf?8 z-Y-Zi_Hvi>oBzV8DSRG!7dm|%IlZg3^0{5~;>)8-+Nk&EhAd(}s^7%MuU}lphNW9Q zT)DPo(ob{tB7_?u;4-qGDo!sh&7gHaJfkh43QwL|bbFVi@+oy;i;M zM&CP^v~lx1U`pi9PmSr&Mc<%HAq0DGH?Ft95)WY`P?~7O z`O^Nr{Py9M#Ls4Y7OM?e%Y*Mvrme%=DwQaye^Qut_1pOMrg^!5u(f9p(D%MR%1K>% zRGw%=dYvw@)o}Fw@tOtPjz`45mfpn;OT&V(;z75J*<$52{sB65$gDjwX3Xa!x_wE- z!#RpwHM#WrO*|~f7z}(}o7US(+0FYLM}6de>gQdtPazXz?OcNv4R^oYLJ_BQOd_l172oSK$6!1r@g+B@0ofJ4*{>_AIxfe-#xp>(1 z@Y3Nfd>fmqvjL;?+DmZk*KsfXJf<%~(gcLwEez%>1c6XSboURUh&k=B)MS>6kw9bY z{7vdev7;A}5fy*ZE23DS{J?8at~xwVk`pEwP5^k?XMQ7u64;KmFJ#POzdG#np~F&H ze-BUh@g54)dsS%nkBb}+GuUEKU~pHcYIg4vSo$J(J|U36bs0Use+3A&IMcR%6@jv$ z=+QI+@wW@?iu}Hpyzlvj-EYeop{f65GX0O%>w#0t|V z1-svWk`hU~m`|O$kw5?Yn5UhI%9P-<45A(v0ld1n+%Ziq&TVpBcV9n}L9Tus-TI)f zd_(g+nYCDR@+wYNQm1GwxhUN4tGMLCzDzPqY$~`l<47{+l<{FZ$L6(>J)|}!bi<)| zE35dl{a2)&leQ@LlDxLQOfUDS`;+ZQ4ozrleQwaR-K|@9T{#hB5Z^t#8 zC-d_G;B4;F#8A2EBL58s$zF-=SCr`P#z zNCTnHF&|X@q>SkAoYu>&s9v@zCpv9lLSH-UZzfhJh`EZA{X#%nqw@@aW^vPcfQrlPs(qQxmC|4tp^&sHy!H!2FH5eC{M@g;ElWNzlb-+ zxpfc0m4<}L){4|RZ>KReag2j%Ot_UKkgpJN!7Y_y3;Ssz{9 z!K3isRtaFtQII5^6}cm9RZd5nTp9psk&u1C(BY`(_tolBwzV_@0F*m%3G%Y?2utyS zY`xM0iDRT)yTyYukFeGQ&W@ReM+ADG1xu@ruq&^GK35`+2r}b^V!m1(VgH|QhIPDE X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/web/icons/Icon-maskable-512.png b/packages/firebase_installations/firebase_installations/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/packages/firebase_installations/firebase_installations/example/web/index.html b/packages/firebase_installations/firebase_installations/example/web/index.html new file mode 100644 index 000000000000..b829dda02342 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/packages/firebase_installations/firebase_installations/example/web/manifest.json b/packages/firebase_installations/firebase_installations/example/web/manifest.json new file mode 100644 index 000000000000..096edf8fe4cd --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart b/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart index 586f76d36381..2b0a9e656263 100644 --- a/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart @@ -8,6 +8,5 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart' show FirebasePluginPlatform; import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; -import 'package:flutter/foundation.dart'; part 'src/firebase_installations.dart'; diff --git a/packages/firebase_installations/firebase_installations/pubspec.yaml b/packages/firebase_installations/firebase_installations/pubspec.yaml index a7a6d8238c52..3f21f6503845 100644 --- a/packages/firebase_installations/firebase_installations/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://firebase.flutter.dev/docs/installations/overview repository: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations environment: - sdk: ">=2.12.0 <3.0.0" - flutter: ">=1.20.0" + sdk: '>=2.12.0 <3.0.0' + flutter: '>=1.20.0' dependencies: firebase_core: ^1.10.0 diff --git a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart index 2f652cf5ae97..777d91692001 100644 --- a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart +++ b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart @@ -16,8 +16,4 @@ void main() { tearDown(() { channel.setMockMethodCallHandler(null); }); - - test('getPlatformVersion', () async { - expect(await FirebaseInstallations.platformVersion, '42'); - }); } diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart index 86ed3ddf330d..42cd4d44af86 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart @@ -27,14 +27,13 @@ class MethodChannelFirebaseInstallations extends FirebaseInstallationsPlatform { /// Creates a new [MethodChannelFirebaseInstallations] instance with an [app]. MethodChannelFirebaseInstallations({required FirebaseApp app}) : super(app) { + _idTokenChangesListeners[app.name] = StreamController.broadcast(); + channel .invokeMethod('FirebaseInstallations#registerIdTokenListener', { 'appName': app.name, }).then((channelName) { final events = EventChannel(channelName!, channel.codec); - - _idTokenChangesListeners[app.name] = StreamController.broadcast(); - events.receiveBroadcastStream().listen( (arguments) { _handleIdTokenChangesListener(app.name, arguments); From cd01e2e98a70a25aae119b74a76ec46a7c2c4c32 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Mon, 29 Nov 2021 21:24:12 +0300 Subject: [PATCH 08/51] feat: initial iOS implementation --- .../ios/Runner.xcodeproj/project.pbxproj | 103 ++++++++++++++++-- .../contents.xcworkspacedata | 3 + .../ios/Runner/GoogleService-Info.plist | 38 +++++++ .../example/ios/Runner/Info.plist | 4 +- .../ios/Classes/FirebaseInstallationsPlugin.m | 23 ++-- .../SwiftFirebaseInstallationsPlugin.swift | 76 +++++++++++++ .../ios/firebase_installations.podspec | 43 ++++++-- 7 files changed, 254 insertions(+), 36 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations/example/ios/Runner/GoogleService-Info.plist create mode 100644 packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj index c6759a6e8f37..d56e922c07ed 100644 --- a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,16 +3,18 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 25FA97EB27554A26002BC25E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 25FA97EA27554A26002BC25E /* GoogleService-Info.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + D31746244E2F2FE1872744CA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69B8F88D9874F0301253207A /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -29,9 +31,14 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0047649AA80D5E08710B83FC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 25FA97EA27554A26002BC25E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../../../../../../../Desktop/GoogleService-Info.plist"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 46C9450C09DECE161F8D2B0E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 69B8F88D9874F0301253207A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 70BA4B84FBF4F8F98882ECE8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -49,6 +56,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D31746244E2F2FE1872744CA /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -72,6 +80,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + B73D1DC58D055FB68C9A8078 /* Pods */, + C9AFE18D56A992DC82EEDD72 /* Frameworks */, ); sourceTree = ""; }; @@ -89,6 +99,7 @@ 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 25FA97EA27554A26002BC25E /* GoogleService-Info.plist */, 97C147021CF9000F007C117D /* Info.plist */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, @@ -98,6 +109,24 @@ path = Runner; sourceTree = ""; }; + B73D1DC58D055FB68C9A8078 /* Pods */ = { + isa = PBXGroup; + children = ( + 0047649AA80D5E08710B83FC /* Pods-Runner.debug.xcconfig */, + 70BA4B84FBF4F8F98882ECE8 /* Pods-Runner.release.xcconfig */, + 46C9450C09DECE161F8D2B0E /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + C9AFE18D56A992DC82EEDD72 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 69B8F88D9874F0301253207A /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -105,12 +134,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 86AB341DFEACCFD6CBE9739D /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ECA47BD16D6FC415D9110B06 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -161,6 +192,7 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 25FA97EB27554A26002BC25E /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -183,6 +215,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 86AB341DFEACCFD6CBE9739D /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -197,6 +251,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + ECA47BD16D6FC415D9110B06 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -272,7 +343,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -290,8 +361,11 @@ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.installations.example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -346,7 +420,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -395,11 +469,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -414,8 +489,11 @@ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.installations.example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -433,8 +511,11 @@ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.installations.example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16ed0f..21a3cc14c74e 100644 --- a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_installations/firebase_installations/example/ios/Runner/GoogleService-Info.plist new file mode 100644 index 000000000000..2bcf5ca4629d --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 448618578101-ff6olegpc8901mthfv42r97oo0gbqebc.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.448618578101-ff6olegpc8901mthfv42r97oo0gbqebc + ANDROID_CLIENT_ID + 448618578101-a9p7bj5jlakabp22fo3cbkj7nsmag24e.apps.googleusercontent.com + API_KEY + AIzaSyAHAsf51D0A407EklG1bs-5wA7EbyfNFg0 + GCM_SENDER_ID + 448618578101 + PLIST_VERSION + 1 + BUNDLE_ID + io.flutter.plugins.firebase.installations.example + PROJECT_ID + react-native-firebase-testing + STORAGE_BUCKET + react-native-firebase-testing.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:448618578101:ios:1135057e92910ad9ac3efc + DATABASE_URL + https://react-native-firebase-testing.firebaseio.com + + \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist b/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist index a060db61e461..67c34806c987 100644 --- a/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner/Info.plist @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Firebase Installations Example CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -11,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - example + firebase_installations_example CFBundlePackageType APPL CFBundleShortVersionString diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m index 301ec8e3dd0d..b389d8e1ed1f 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m @@ -1,20 +1,15 @@ #import "FirebaseInstallationsPlugin.h" +#if __has_include() +#import +#else +// Support project import fallback if the generated compatibility header +// is not copied when this plugin is created as a library. +// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 +#import "firebase_installations-Swift.h" +#endif @implementation FirebaseInstallationsPlugin + (void)registerWithRegistrar:(NSObject*)registrar { - FlutterMethodChannel* channel = [FlutterMethodChannel - methodChannelWithName:@"firebase_installations" - binaryMessenger:[registrar messenger]]; - FirebaseInstallationsPlugin* instance = [[FirebaseInstallationsPlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; + [SwiftFirebaseInstallationsPlugin registerWithRegistrar:registrar]; } - -- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { - if ([@"getPlatformVersion" isEqualToString:call.method]) { - result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]); - } else { - result(FlutterMethodNotImplemented); - } -} - @end diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift new file mode 100644 index 000000000000..15c17a9f4aad --- /dev/null +++ b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift @@ -0,0 +1,76 @@ +import Flutter +import UIKit +import firebase_core + +import FirebaseInstallations + +public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin { + + var channel:String?; + + init(channelName:String) { + channel = channelName; + } + + public static func register(with registrar: FlutterPluginRegistrar) { + let channelName = "plugins.flutter.io/firebase_installations"; + let channel = FlutterMethodChannel(name: channelName, binaryMessenger: registrar.messenger()) + let instance = SwiftFirebaseInstallationsPlugin(channelName: channelName) + registrar.addMethodCallDelegate(instance, channel: channel) + } + + /// Get Installations instance for a Firebase App. + /// - Parameter arguments: the arguments passed by the Dart calling method + /// - Returns: a Firebase Installations instance for the passed app from Dart + internal func getInstallations(arguments: NSDictionary) -> Installations { + let appName = FLTFirebasePlugin.firebaseAppName(fromDartName: (arguments["appName"] as! String)) + let app:FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(appName)! + return Installations.installations(app: app) + } + + /// Get Installations Id for an instance. + internal func getId(arguments: NSDictionary, result: FLTFirebaseMethodCallResult) { + let instance:Installations = getInstallations(arguments: arguments); + + var installationsId:String = "" + + instance.installationID { (id:String?, error:Error?) in + if error != nil { + result.error(nil, nil, nil, error) + } + + installationsId = id ?? "" + NSLog("Firebase Installation ID: %@", installationsId) + + result.success(id) + } + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + let args = call.arguments as! NSDictionary + + let errorBlock:FLTFirebaseMethodCallErrorBlock = { (code, message, details, error) in + if(code == nil) { + + } + if(code == "unknown") { + NSLog("FLTFirebaseInstallations: An error occured while calling method %@", call.method) + } + + result(FLTFirebasePlugin.createFlutterError(fromCode: code!, + message: message!, + optionalDetails: details, + andOptionalNSError: error)) + }; + + let methodCallResult:FLTFirebaseMethodCallResult = .create(success: result, andErrorBlock: errorBlock) + + switch (call.method) { + case "FirebaseInstallations#getId": + getId(arguments: args, result: methodCallResult) + default: + result(FlutterMethodNotImplemented) + } + + } +} diff --git a/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec b/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec index b9a65fd0fe32..c8dc7fb9f405 100644 --- a/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec +++ b/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec @@ -1,7 +1,20 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. -# Run `pod lib lint firebase_installations.podspec` to validate before publishing. -# +require 'yaml' + +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + Pod::Spec.new do |s| s.name = 'firebase_installations' s.version = '0.0.1' @@ -13,11 +26,21 @@ A new flutter plugin project. s.license = { :file => '../LICENSE' } s.author = { 'Your Company' => 'email@example.com' } s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.platform = :ios, '8.0' + + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/*.h' + + s.ios.deployment_target = '10.0' - # Flutter.framework does not contain a i386 slice. - s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } + s.swift_version = '5.5' + + s.dependency 'Flutter' + s.dependency 'firebase_core' + s.dependency 'Firebase/Installations', firebase_sdk_version + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\@\\\"#{library_version}\\\" LIBRARY_NAME=\\@\\\"flutter-fire-rtdb\\\"", + 'DEFINES_MODULE' => 'YES' + } end From 65d951b7312d946d3e47808d54f63559b8b65c66 Mon Sep 17 00:00:00 2001 From: ehesp Date: Tue, 30 Nov 2021 09:43:36 +0000 Subject: [PATCH 09/51] chore: add documentation --- docs/installations/overview.mdx | 70 +++++++++++++++++++++ docs/installations/usage.mdx | 108 ++++++++++++++++++++++++++++++++ docs/sidebars.js | 4 ++ website/plugins.js | 12 ++++ 4 files changed, 194 insertions(+) create mode 100644 docs/installations/overview.mdx create mode 100644 docs/installations/usage.mdx diff --git a/docs/installations/overview.mdx b/docs/installations/overview.mdx new file mode 100644 index 000000000000..f96056006d27 --- /dev/null +++ b/docs/installations/overview.mdx @@ -0,0 +1,70 @@ +--- +title: Firebase Installations +sidebar_label: Overview +--- + +## What does it do? + +Firebase Installations is a service that allows you to manage the installation of your app on a user's device. +The Firebase installations service (FIS) provides a Firebase installation ID (FID) for each installed instance of a Firebase app. + +Internally, the installation ID is used by the following Firebase Services: + +- Firebase Cloud Messaging (FCM) +- Firebase In-App Messaging (FIAM) +- Firebase Performance Monitoring +- Firebase Predictions +- Google Analytics for Firebase +- Firebase Remote Config +- Firebase ML + +Tpically, Firebase services use the Firebase installations service without requiring developers to interact directly with the FIS API. However, there are cases where app developers might want to directly call the FIS API, such as: + +- To delete a Firebase installation and data tied to the installation. +- To retrieve identifiers (Firebase installation IDs) in order to target specific app installations. +- To retrieve installation auth tokens to authenticate Firebase installations. + +## Installation + +Add the `firebase_installations` dependency to your projects `pubspec.yaml` file: + +```yaml {5} title="pubspec.yaml" +dependencies: + flutter: + sdk: flutter + firebase_core: "^{{ plugins.firebase_core_ns }}" + firebase_installations: "^{{ plugins.firebase_installations_ns }}" +``` + +### 2. Download dependency + +``` +$ flutter pub get +``` + +### 3. (Web Only) Add the SDK + +If using FlutterFire on the web, add the `firebase-installations` JavaScript SDK to your `index.html` file: + +```html {5} title="web/index.html" + + ... + + + + + +``` + +### 4. Rebuild your app + +Once complete, rebuild your Flutter application: + +```bash +$ flutter run +``` + +## Next Steps + +Once installed, you're ready to start using Firebase Installations in your Flutter Project. View the +[Usage documentation](./usage.mdx) to get started. \ No newline at end of file diff --git a/docs/installations/usage.mdx b/docs/installations/usage.mdx new file mode 100644 index 000000000000..a63d86dd0496 --- /dev/null +++ b/docs/installations/usage.mdx @@ -0,0 +1,108 @@ +--- +title: Firebase Installations +sidebar_label: Usage +--- + +To start using the Firebase Installations package within your project, import it at the top of your project files: + +```dart +import 'package:firebase_installations/firebase_installations.dart'; +``` + +Before using Firebase Installations, you must first have ensured you have [initialized FlutterFire](../overview.mdx#initializing-flutterfire). + +To create a new Installations instance, call the [`instance`](!firebase_installations.FirebaseInstallations.instance) getter on +[`FirebaseInstallations`](!firebase_installations.FirebaseInstallations): + +```dart +FirebaseInstallations installations = FirebaseInstallations.instance; +``` + +By default, this allows you to interact with Installations using the default Firebase App used whilst installing +FlutterFire on your platform. If however you'd like to use a secondary Firebase App, use the `instanceFor` method: + +```dart +FirebaseApp secondaryApp = Firebase.app('SecondaryApp'); +FirebaseInstallations installations = FirebaseInstallations.instanceFor(app: secondaryApp); +``` + +## Delete a Firebase installation + +Data tied to a Firebase installation is generally not personally identifying. Still, it can be helpful to give users an option to manage and delete this data. + +Firebase installation IDs are different for every installation of every application; different applications on the same device have different Firebase installation IDs. +Firebase installation IDs identify app installations and data tied to those app installations. + +When you delete an installation ID, the data tied to that installation ID is removed from live and backup systems of all Firebase services that use Firebase installation +IDs to identify installations within 180 days. This process is described at a high level in Google’s [statement on deletion and retention](https://policies.google.com/technologies/retention). + +Unless you disable all FID-generating services in your app, FIS creates a new ID within a few days. Firebase considers the newly-created ID to be a new Firebase installation, +and doesn't associate it with the previous ID or data in any way. + +To delete an FID, call the `delete` method on the [`FirebaseInstallations`](!firebase_installations.FirebaseInstallations) instance: + +```dart +await FirebaseInstallations.instance.delete(); +``` + +## Retrieve client identifers + +If you have a requirement to identify particular installations of your app, you can do so by retrieving the Firebase installation ID. +For example, to perform testing during Firebase In-App Messaging development, you can identify and target the correct test device using +its Firebase installation ID. + +To get the Firebase installation ID, call the `getId` method on the [`FirebaseInstallations`](!firebase_installations.FirebaseInstallations) instance: + +```dart +String id = await FirebaseInstallations.instance.getId(); +``` + +## Retrieve installation auth tokens + +Firebase services can authenticate Firebase installations with auth tokens retrieved from FIS. For example, when designing A/B tests for Remote Config, +you can authenticate a targeted test device using an installation auth token. + +An installation auth token is a short-lived bearer token in JSON web token (JWT) format containing the following information for an installation: + +- The Firebase installation ID +- The associated project (projectNumber) +- The associated Firebase application ID (appId) +- The token's expiration date + +An installation auth token cannot be revoked, and remains valid until its expiration date. The default token lifetime is one week. + +To retrieve an installation auth token: + +```dart +String token = await FirebaseInstallations.instance.getToken(); +``` + +Optionally, you can force a token refresh when called: + +```dart +String token = await FirebaseInstallations.instance.getToken(true); +``` + +## Monitor the Firebase installation ID lifecycle + +During the normal operation of an app, Firebase installation IDs (FIDs) don't require special monitoring. However, apps that explictly retrieve and +use FIDs should add logic to monitor the potential deletion or rotation of the FID. Here are some cases where FIDs could be deleted or rotated: + +- Uninstallation or reinstallation of the app, for instance when an end user installs on a new device. +- The end user clears the cache of the app or the device. +- FID deletion is triggered in the backend due to app inactivity (currently the threshold for this is 270 days of inactivity). + +When apps experience FID rotation or deletion in these kinds of cases, they are assigned a new FID. Also, the installation auth token associated with +a deleted FID is deleted, regardless of its own maturity, and is replaced with a new installation auth token. + +Apps can monitor these changes and respond accordingly. + +To monitor the FID token, listen to the `Stream` returned from the `idTokenChanges` getter: + +```dart +FirebaseInstallations.instance.idTokenChanges.listen((token) { + print('FID token: $token'); +}); +``` + + diff --git a/docs/sidebars.js b/docs/sidebars.js index 66fa94bd6cd6..c1a6ab5695fe 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -59,6 +59,10 @@ module.exports = { toReferenceAPI("cloud_functions"), toGithubExample("cloud_functions"), ], + Installations: [ + "installations/overview", + "installations/usage", + ], "Cloud Messaging": [ "messaging/overview", "messaging/usage", diff --git a/website/plugins.js b/website/plugins.js index 39b103160e81..e06304198726 100644 --- a/website/plugins.js +++ b/website/plugins.js @@ -71,6 +71,18 @@ module.exports = [ macos: true, }, }, + { + name: 'Installations', + pub: 'installations', + firebase: 'https://firebase.google.com/docs/projects/manage-installations', + status: 'Stable', + documentation: 'https://firebase.flutter.dev/docs/installations/overview', + support: { + web: true, + mobile: true, + macos: true, + }, + }, { name: 'Cloud Messaging', pub: 'firebase_messaging', From 7650154fcd28b8902c0004090d2d0c2ab96fa9ed Mon Sep 17 00:00:00 2001 From: ehesp Date: Tue, 30 Nov 2021 10:36:39 +0000 Subject: [PATCH 10/51] chore: add version --- docs/versions.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/versions.js b/docs/versions.js index 9128fda4a7b0..158068e201f2 100644 --- a/docs/versions.js +++ b/docs/versions.js @@ -31,16 +31,17 @@ export default { firebase_performance_ns: PUB_NS_FIREBASE_PERFORMANCE, firebase_remote_config: PUB_FIREBASE_REMOTE_CONFIG, firebase_remote_config_ns: PUB_NS_FIREBASE_REMOTE_CONFIG, - google_sign_in: "^4.4.4", + firebase_installations_ns: PUB_NS_FIREBASE_INSTALLATIONS, + google_sign_in: '^4.4.4', }, android: { - google_services: "4.3.8", // com.google.gms:google-services + google_services: '4.3.8', // com.google.gms:google-services }, web: { - firebase_cdn: "8.6.1", // https://firebase.google.com/support/release-notes/js + firebase_cdn: '8.6.1', // https://firebase.google.com/support/release-notes/js }, external: { - google_sign_in: "^4.5.1", - flutter_facebook_auth: "^3.5.0", - } + google_sign_in: '^4.5.1', + flutter_facebook_auth: '^3.5.0', + }, }; From 7125740a95001c8dfbf7b2ab18adeca0c651b8e2 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Tue, 30 Nov 2021 18:53:26 +0300 Subject: [PATCH 11/51] feat: idTokenChanged event channel --- .../ios/Classes/IdChangedStreamHandler.swift | 56 +++++++ .../SwiftFirebaseInstallationsPlugin.swift | 138 +++++++++++++++--- 2 files changed, 173 insertions(+), 21 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift new file mode 100644 index 000000000000..d6c89051db1d --- /dev/null +++ b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift @@ -0,0 +1,56 @@ +import Foundation +import FirebaseInstallations + +class IdChangedStreamHandler: NSObject, FlutterStreamHandler { + + var eventSink: FlutterEventSink? + var installationIDObserver: NSObjectProtocol?; + var instance:Installations; + var authToken:String = ""; + + init(instance: Installations) { + self.instance = instance; + } + + @objc func handleInstallationIDChange() { + var events = Dictionary(); + + var installationsAuthToken:String = "" + + // Fetch new auth token + self.instance.authTokenForcingRefresh (true, completion: {(tokenResult:InstallationsAuthTokenResult?, error:Error?) in + if error != nil { + self.eventSink!(FlutterError()) + } + installationsAuthToken = tokenResult?.authToken ?? "" + if(installationsAuthToken != self.authToken) { + self.authToken = installationsAuthToken; + events["token"] = self.authToken; + self.eventSink!(events) + } + + }); + } + + public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { + eventSink = events + + // [START handle_installation_id_change] + installationIDObserver = NotificationCenter.default.addObserver( + forName: .InstallationIDDidChange, + object: nil, + queue: nil + ) { (notification) in + self.handleInstallationIDChange() + } + // [END handle_installation_id_change] + + return nil + } + + public func onCancel(withArguments arguments: Any?) -> FlutterError? { + self.eventSink = nil + return nil + } + +} diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift index 15c17a9f4aad..7565dc662c06 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift +++ b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift @@ -1,73 +1,169 @@ import Flutter import UIKit import firebase_core - import FirebaseInstallations public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin { - var channel:String?; + private var channelName:String; + private var eventSink: FlutterEventSink? + private var messenger:FlutterBinaryMessenger; + + var result:FLTFirebaseMethodCallResult?; + var streamHandler = Dictionary(); + + var args = NSDictionary.init(); - init(channelName:String) { - channel = channelName; + init(channelName:String, messenger:FlutterBinaryMessenger) { + self.channelName = channelName; + self.messenger = messenger; } public static func register(with registrar: FlutterPluginRegistrar) { let channelName = "plugins.flutter.io/firebase_installations"; let channel = FlutterMethodChannel(name: channelName, binaryMessenger: registrar.messenger()) - let instance = SwiftFirebaseInstallationsPlugin(channelName: channelName) + let instance = SwiftFirebaseInstallationsPlugin(channelName: channelName, messenger: registrar.messenger()) registrar.addMethodCallDelegate(instance, channel: channel) } - /// Get Installations instance for a Firebase App. - /// - Parameter arguments: the arguments passed by the Dart calling method + @objc private func onIdChanged(notification: NSNotification) { + print("changed") + } + + /// Gets Installations instance for a Firebase App. /// - Returns: a Firebase Installations instance for the passed app from Dart - internal func getInstallations(arguments: NSDictionary) -> Installations { - let appName = FLTFirebasePlugin.firebaseAppName(fromDartName: (arguments["appName"] as! String)) + internal func getInstallations() -> Installations { + let appName = FLTFirebasePlugin.firebaseAppName(fromDartName: (args["appName"] as! String)) let app:FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(appName)! return Installations.installations(app: app) } - /// Get Installations Id for an instance. - internal func getId(arguments: NSDictionary, result: FLTFirebaseMethodCallResult) { - let instance:Installations = getInstallations(arguments: arguments); + /// Gets Installations Id for an instance. + /// - Parameter arguments: the arguments passed by the Dart calling method + /// - Parameter result: the result instance used to send the result to Dart. + internal func getId() { + let instance:Installations = getInstallations(); var installationsId:String = "" instance.installationID { (id:String?, error:Error?) in if error != nil { - result.error(nil, nil, nil, error) + self.result!.error(nil, nil, nil, error) } installationsId = id ?? "" NSLog("Firebase Installation ID: %@", installationsId) - result.success(id) + self.result!.success(id) + } + } + + /// Deletes Installations Id for an instance. + internal func deleteId() { + let instance:Installations = getInstallations(); + + instance.delete { (error:Error?) in + if error != nil { + self.result!.error(nil, nil, nil, error) + } + + NSLog("Firebase Installation ID deleted successfully.") + } + + self.result!.success(nil) + } + + /// Gets the token Id for an instance. + internal func getToken() { + let instance:Installations = getInstallations(); + + var installationsAuthToken:String = "" + + let forceRefresh:Bool = (args["forceRefresh"] as? Bool) ?? false; + + instance.authTokenForcingRefresh (forceRefresh, completion: {(tokenResult:InstallationsAuthTokenResult?, error:Error?) in + if error != nil { + let userInfo:NSDictionary = error!._userInfo as! NSDictionary + let underlyingError:NSError = userInfo.object(forKey: NSUnderlyingErrorKey) as! NSError + + let firebaseDictionary:NSDictionary? = underlyingError.userInfo as NSDictionary; + if(firebaseDictionary != nil && firebaseDictionary!["NSLocalizedDescription"] != nil) { + self.result!.error(nil, firebaseDictionary!["NSLocalizedDescription"] as? String, nil, error) + } + self.result!.error(nil, nil, nil, underlyingError) + } + + installationsAuthToken = tokenResult?.authToken ?? "" + + NSLog("Firebase Installation Auth Token: %@", installationsAuthToken) + + self.result!.success(installationsAuthToken) + }); + } + + /// Starts listening to Installation ID events for an instance. + internal func registerTokenListener() { + let instance:Installations = getInstallations(); + + let appName = (args["appName"] as! String) + let eventChannelName:String = channelName + "/token/" + appName; + + let eventChannel = FlutterEventChannel(name: eventChannelName, binaryMessenger: messenger) + + if (self.streamHandler[eventChannelName] == nil) { + self.streamHandler[eventChannelName] = IdChangedStreamHandler(instance: instance) } + + eventChannel.setStreamHandler((self.streamHandler[eventChannelName]!)) + + result?.success(eventChannelName) + } + + internal func getNSDictionaryFromNSError(error:NSError?) -> Dictionary { + let code:NSString = "unknown"; + let message:NSString = "An unknown error has occurred."; + + return [ + "code": code, "message": message, "additionalData": {} + ]; } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { let args = call.arguments as! NSDictionary let errorBlock:FLTFirebaseMethodCallErrorBlock = { (code, message, details, error) in - if(code == nil) { - + var errorDetails:Dictionary = Dictionary(); + + if(error == nil) { + errorDetails = self.getNSDictionaryFromNSError(error: error as NSError?); + } else { + errorDetails["code"] = code ?? "unknown" + errorDetails["message"] = message ?? "An unknown error has occurred." + errorDetails["additionalData"] = details } + if(code == "unknown") { NSLog("FLTFirebaseInstallations: An error occured while calling method %@", call.method) } - result(FLTFirebasePlugin.createFlutterError(fromCode: code!, - message: message!, - optionalDetails: details, + result(FLTFirebasePlugin.createFlutterError(fromCode: errorDetails["code"] as! String, + message: errorDetails["message"] as! String, + optionalDetails: (errorDetails["additionalData"] as? [AnyHashable : Any]), andOptionalNSError: error)) }; - let methodCallResult:FLTFirebaseMethodCallResult = .create(success: result, andErrorBlock: errorBlock) + self.result = .create(success: result, andErrorBlock: errorBlock) + self.args = args switch (call.method) { case "FirebaseInstallations#getId": - getId(arguments: args, result: methodCallResult) + getId() + case "FirebaseInstallations#delete": + deleteId() + case "FirebaseInstallations#getToken": + getToken() + case "FirebaseInstallations#registerIdTokenListener": + registerTokenListener() default: result(FlutterMethodNotImplemented) } From 67e2e029beda9f5e59b649e3a886bd95257491c7 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Tue, 30 Nov 2021 18:54:33 +0300 Subject: [PATCH 12/51] feat: example app enhancments --- .../example/lib/main.dart | 143 ++++++++++++++---- 1 file changed, 112 insertions(+), 31 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart index 1d682a25adbc..6367c4ff379b 100644 --- a/packages/firebase_installations/firebase_installations/example/lib/main.dart +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -1,7 +1,8 @@ import 'dart:developer'; -import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; + +import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_installations/firebase_installations.dart'; void main() async { @@ -12,28 +13,50 @@ void main() async { runApp(const MyApp()); } -class MyApp extends StatefulWidget { +class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override - State createState() => _MyAppState(); + Widget build(BuildContext context) { + return MaterialApp( + theme: ThemeData(primarySwatch: Colors.amber), + home: Scaffold( + appBar: AppBar( + title: const Text('Firebase Installations'), + ), + body: const InstallationsCard(), + ), + ); + } } -class _MyAppState extends State { +class InstallationsCard extends StatefulWidget { + const InstallationsCard({Key? key}) : super(key: key); + + @override + _InstallationsCardState createState() => _InstallationsCardState(); +} + +class _InstallationsCardState extends State { @override void initState() { super.initState(); logResults(); FirebaseInstallations.instance.idTokenChanges.listen((event) { - log(event); + setState(() { + authToken = event; + }); + + ScaffoldMessenger.of(context) + .showSnackBar(const SnackBar(content: Text('Auth token updated!'))); }).onError((error) { log("$error"); }); } - String id = ''; - String oldToken = ''; + String id = 'None'; + String authToken = 'None'; Future logResults() async { final id = await FirebaseInstallations.instance.getId(); @@ -45,34 +68,92 @@ class _MyAppState extends State { @override Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Plugin example app'), - ), - body: Column( - children: [ - Center( - child: Text("Id: $id"), + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + SizedBox( + width: double.infinity, + child: Card( + margin: EdgeInsets.zero, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Expanded( + child: Text("Installation Id: "), + ), + Expanded( + flex: 2, + child: Text(id), + ), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Expanded( + child: Text("Auth Token: "), + ), + Expanded( + flex: 2, + child: Text(authToken), + ), + ], + ), + ], + ), + ), ), - ElevatedButton( + ), + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + child: ElevatedButton( onPressed: () async { - await FirebaseInstallations.instance.getToken(true); + final token = + await FirebaseInstallations.instance.getToken(true); + setState(() { + authToken = token; + }); }, child: const Text("Force update token"), - ) - ], - ), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.delete), - onPressed: () async { - await FirebaseInstallations.instance.delete(); - final _newid = await FirebaseInstallations.instance.getId(); - - setState(() { - id = _newid; - }); - }), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: ElevatedButton( + onPressed: () { + FirebaseInstallations.instance + .delete() + .then((_) => setState(() { + id = 'None'; + })); + }, + child: const Text("Delete ID"), + ), + ), + const SizedBox(width: 20), + Expanded( + child: ElevatedButton( + onPressed: () async { + final _newid = await FirebaseInstallations.instance.getId(); + + setState(() { + id = _newid; + }); + }, + child: const Text("Get ID"), + ), + ) + ], + ) + ], ), ); } From 01e15d947fb874a747b31dd019b7d8a6b40009fe Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Wed, 1 Dec 2021 13:57:12 +0300 Subject: [PATCH 13/51] feat: iOS error handling --- .../example/lib/main.dart | 59 ++++++++----- .../ios/Classes/FirebaseInstallationsPlugin.h | 3 +- .../ios/Classes/FirebaseInstallationsPlugin.m | 22 +++++ .../SwiftFirebaseInstallationsPlugin.swift | 85 ++++++++++--------- 4 files changed, 105 insertions(+), 64 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart index 6367c4ff379b..a4158bd61244 100644 --- a/packages/firebase_installations/firebase_installations/example/lib/main.dart +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -66,6 +66,41 @@ class _InstallationsCardState extends State { }); } + Future deleteId() async { + try { + await FirebaseInstallations.instance.delete(); + + setState(() { + id = 'None'; + }); + } catch (e) { + log('$e'); + } + } + + Future getId() async { + try { + final _newid = await FirebaseInstallations.instance.getId(); + + setState(() { + id = _newid; + }); + } catch (e) { + log('$e'); + } + } + + Future getAuthToken() async { + try { + final token = await FirebaseInstallations.instance.getToken(true); + setState(() { + authToken = token; + }); + } catch (e) { + log('$e'); + } + } + @override Widget build(BuildContext context) { return Padding( @@ -113,13 +148,7 @@ class _InstallationsCardState extends State { SizedBox( width: double.infinity, child: ElevatedButton( - onPressed: () async { - final token = - await FirebaseInstallations.instance.getToken(true); - setState(() { - authToken = token; - }); - }, + onPressed: getAuthToken, child: const Text("Force update token"), ), ), @@ -128,26 +157,14 @@ class _InstallationsCardState extends State { children: [ Expanded( child: ElevatedButton( - onPressed: () { - FirebaseInstallations.instance - .delete() - .then((_) => setState(() { - id = 'None'; - })); - }, + onPressed: deleteId, child: const Text("Delete ID"), ), ), const SizedBox(width: 20), Expanded( child: ElevatedButton( - onPressed: () async { - final _newid = await FirebaseInstallations.instance.getId(); - - setState(() { - id = _newid; - }); - }, + onPressed: getId, child: const Text("Get ID"), ), ) diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h index 1ee58326f2e1..31d7414acd83 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h @@ -1,4 +1,5 @@ #import +#import -@interface FirebaseInstallationsPlugin : NSObject +@interface FirebaseInstallationsPlugin : FLTFirebasePlugin @end diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m index b389d8e1ed1f..a3525542d0f7 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m @@ -12,4 +12,26 @@ @implementation FirebaseInstallationsPlugin + (void)registerWithRegistrar:(NSObject*)registrar { [SwiftFirebaseInstallationsPlugin registerWithRegistrar:registrar]; } + +- (void)didReinitializeFirebaseCore:(void (^ _Nonnull)(void))completion { + completion(); +} + +- (NSString * _Nonnull)firebaseLibraryName { + return LIBRARY_NAME; +} + +- (NSString * _Nonnull)firebaseLibraryVersion { + return LIBRARY_VERSION; +} + +- (NSString * _Nonnull)flutterChannelName { + return @"plugins.flutter.io/firebase_installations"; +} + +- (NSDictionary * _Nonnull)pluginConstantsForFIRApp:(FIRApp * _Nonnull)firebaseApp { + return @{}; +} + @end + diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift index 7565dc662c06..1f07793c12f6 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift +++ b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift @@ -3,9 +3,10 @@ import UIKit import firebase_core import FirebaseInstallations +let kFLTFirebaseInstallationsChannelName = "plugins.flutter.io/firebase_installations"; + public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin { - private var channelName:String; private var eventSink: FlutterEventSink? private var messenger:FlutterBinaryMessenger; @@ -14,15 +15,13 @@ public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin var args = NSDictionary.init(); - init(channelName:String, messenger:FlutterBinaryMessenger) { - self.channelName = channelName; + init(messenger:FlutterBinaryMessenger) { self.messenger = messenger; } public static func register(with registrar: FlutterPluginRegistrar) { - let channelName = "plugins.flutter.io/firebase_installations"; - let channel = FlutterMethodChannel(name: channelName, binaryMessenger: registrar.messenger()) - let instance = SwiftFirebaseInstallationsPlugin(channelName: channelName, messenger: registrar.messenger()) + let channel = FlutterMethodChannel(name: kFLTFirebaseInstallationsChannelName, binaryMessenger: registrar.messenger()) + let instance = SwiftFirebaseInstallationsPlugin(messenger: registrar.messenger()) registrar.addMethodCallDelegate(instance, channel: channel) } @@ -49,12 +48,14 @@ public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin instance.installationID { (id:String?, error:Error?) in if error != nil { self.result!.error(nil, nil, nil, error) + } else { + installationsId = id ?? "" + NSLog("Firebase Installation ID: %@", installationsId) + + self.result!.success(id) } - installationsId = id ?? "" - NSLog("Firebase Installation ID: %@", installationsId) - - self.result!.success(id) + } } @@ -65,12 +66,12 @@ public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin instance.delete { (error:Error?) in if error != nil { self.result!.error(nil, nil, nil, error) + } else { + NSLog("Firebase Installation ID deleted successfully.") + self.result!.success(nil) } - - NSLog("Firebase Installation ID deleted successfully.") } - self.result!.success(nil) } /// Gets the token Id for an instance. @@ -83,21 +84,14 @@ public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin instance.authTokenForcingRefresh (forceRefresh, completion: {(tokenResult:InstallationsAuthTokenResult?, error:Error?) in if error != nil { - let userInfo:NSDictionary = error!._userInfo as! NSDictionary - let underlyingError:NSError = userInfo.object(forKey: NSUnderlyingErrorKey) as! NSError + self.result!.error(nil, nil, nil, error) + } else { + installationsAuthToken = tokenResult?.authToken ?? "" - let firebaseDictionary:NSDictionary? = underlyingError.userInfo as NSDictionary; - if(firebaseDictionary != nil && firebaseDictionary!["NSLocalizedDescription"] != nil) { - self.result!.error(nil, firebaseDictionary!["NSLocalizedDescription"] as? String, nil, error) - } - self.result!.error(nil, nil, nil, underlyingError) + NSLog("Firebase Installation Auth Token: %@", installationsAuthToken) + + self.result!.success(installationsAuthToken) } - - installationsAuthToken = tokenResult?.authToken ?? "" - - NSLog("Firebase Installation Auth Token: %@", installationsAuthToken) - - self.result!.success(installationsAuthToken) }); } @@ -106,7 +100,7 @@ public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin let instance:Installations = getInstallations(); let appName = (args["appName"] as! String) - let eventChannelName:String = channelName + "/token/" + appName; + let eventChannelName:String = kFLTFirebaseInstallationsChannelName + "/token/" + appName; let eventChannel = FlutterEventChannel(name: eventChannelName, binaryMessenger: messenger) @@ -119,28 +113,35 @@ public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin result?.success(eventChannelName) } - internal func getNSDictionaryFromNSError(error:NSError?) -> Dictionary { - let code:NSString = "unknown"; - let message:NSString = "An unknown error has occurred."; - - return [ - "code": code, "message": message, "additionalData": {} - ]; + + internal func mapInstallationsErrorCodes(code:UInt) -> NSString { + let error = InstallationsErrorCode.init(rawValue: code) ?? InstallationsErrorCode.unknown; + + switch error { + case InstallationsErrorCode.invalidConfiguration: + return "invalid-configuration"; + case InstallationsErrorCode.keychain: + return "invalid-keychain"; + case InstallationsErrorCode.serverUnreachable: + return "server-unreachable"; + case InstallationsErrorCode.unknown: + return "unknown"; + default: + return "unknown"; + } } + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { let args = call.arguments as! NSDictionary - let errorBlock:FLTFirebaseMethodCallErrorBlock = { (code, message, details, error) in + let errorBlock:FLTFirebaseMethodCallErrorBlock = { (code, message, details, error:Error?) in var errorDetails:Dictionary = Dictionary(); - if(error == nil) { - errorDetails = self.getNSDictionaryFromNSError(error: error as NSError?); - } else { - errorDetails["code"] = code ?? "unknown" - errorDetails["message"] = message ?? "An unknown error has occurred." - errorDetails["additionalData"] = details - } + errorDetails["code"] = code ?? self.mapInstallationsErrorCodes(code:UInt((error! as NSError).code)) + errorDetails["message"] = message ?? error?.localizedDescription ?? "An unknown error has occurred."; + errorDetails["additionalData"] = details + if(code == "unknown") { NSLog("FLTFirebaseInstallations: An error occured while calling method %@", call.method) From 687fb9db531d8e49f8527e6b468ba7bab25e8575 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Wed, 1 Dec 2021 14:01:52 +0300 Subject: [PATCH 14/51] chore: remove Android dev logs --- .../firebase_installations/TokenChannelStreamHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java index 9c9acca7ecbf..82025d105b3f 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java @@ -40,7 +40,6 @@ FidListener createTokenEventListener(final EventChannel.EventSink events) { return token -> { Map event = new HashMap<>(); - Log.d("TOKEN", token); event.put("token" , token); events.success(event); From c1ac3e7d6132f037ace0690a04637b67706a0571 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Wed, 1 Dec 2021 17:57:49 +0300 Subject: [PATCH 15/51] feat: fix eventChannel iOS implementation --- .../example/lib/firebase_config.dart | 47 ++++++ .../example/lib/main.dart | 142 +++++++++--------- .../ios/Classes/IdChangedStreamHandler.swift | 38 +++-- 3 files changed, 137 insertions(+), 90 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations/example/lib/firebase_config.dart diff --git a/packages/firebase_installations/firebase_installations/example/lib/firebase_config.dart b/packages/firebase_installations/firebase_installations/example/lib/firebase_config.dart new file mode 100644 index 000000000000..9eaaa126e8d2 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/lib/firebase_config.dart @@ -0,0 +1,47 @@ +import 'dart:io'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; + +class DefaultFirebaseConfig { + static FirebaseOptions get platformOptions { + if (kIsWeb) { + // Web + return const FirebaseOptions( + apiKey: 'AIzaSyAgUhHU8wSJgO5MVNy95tMT07NEjzMOfz0', + authDomain: 'react-native-firebase-testing.firebaseapp.com', + databaseURL: 'https://react-native-firebase-testing.firebaseio.com', + projectId: 'react-native-firebase-testing', + storageBucket: 'react-native-firebase-testing.appspot.com', + messagingSenderId: '448618578101', + appId: '1:448618578101:web:0b650370bb29e29cac3efc', + measurementId: 'G-F79DJ0VFGS', + ); + } else if (Platform.isIOS || Platform.isMacOS) { + // iOS and MacOS + return const FirebaseOptions( + appId: '1:448618578101:ios:f7208957983eeee4ac3efc', + apiKey: 'AIzaSyAHAsf51D0A407EklG1bs-5wA7EbyfNFg0', + projectId: 'react-native-firebase-testing', + messagingSenderId: '448618578101', + iosBundleId: 'io.flutter.plugins.firebase.installations.example', + iosClientId: + '448618578101-ff6olegpc8901mthfv42r97oo0gbqebc.apps.googleusercontent.com', + androidClientId: + '448618578101-a9p7bj5jlakabp22fo3cbkj7nsmag24e.apps.googleusercontent.com', + databaseURL: 'https://react-native-firebase-testing.firebaseio.com', + storageBucket: 'react-native-firebase-testing.appspot.com', + ); + } else { + // Android + return const FirebaseOptions( + appId: '1:448618578101:android:a723be2eb2bf60d9ac3efc', + apiKey: 'AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA', + projectId: 'react-native-firebase-testing', + messagingSenderId: '448618578101', + databaseURL: 'https://react-native-firebase-testing.firebaseio.com', + storageBucket: 'react-native-firebase-testing.appspot.com', + ); + } + } +} diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart index a4158bd61244..848a7e48f7f8 100644 --- a/packages/firebase_installations/firebase_installations/example/lib/main.dart +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:example/firebase_config.dart'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; @@ -8,7 +9,7 @@ import 'package:firebase_installations/firebase_installations.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - await Firebase.initializeApp(); + await Firebase.initializeApp(options: DefaultFirebaseConfig.platformOptions); runApp(const MyApp()); } @@ -41,15 +42,17 @@ class _InstallationsCardState extends State { @override void initState() { super.initState(); - logResults(); - + getAuthToken(); + getId(); FirebaseInstallations.instance.idTokenChanges.listen((event) { setState(() { - authToken = event; + id = event; }); - ScaffoldMessenger.of(context) - .showSnackBar(const SnackBar(content: Text('Auth token updated!'))); + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('New Firebase Installations Id generated 🎉'), + backgroundColor: Colors.green, + )); }).onError((error) { log("$error"); }); @@ -58,14 +61,6 @@ class _InstallationsCardState extends State { String id = 'None'; String authToken = 'None'; - Future logResults() async { - final id = await FirebaseInstallations.instance.getId(); - - setState(() { - this.id = id; - }); - } - Future deleteId() async { try { await FirebaseInstallations.instance.delete(); @@ -90,9 +85,9 @@ class _InstallationsCardState extends State { } } - Future getAuthToken() async { + Future getAuthToken([forceRefresh = false]) async { try { - final token = await FirebaseInstallations.instance.getToken(true); + final token = await FirebaseInstallations.instance.getToken(forceRefresh); setState(() { authToken = token; }); @@ -105,72 +100,79 @@ class _InstallationsCardState extends State { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - SizedBox( - width: double.infinity, - child: Card( - margin: EdgeInsets.zero, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Expanded( - child: Text("Installation Id: "), - ), - Expanded( - flex: 2, - child: Text(id), - ), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 500), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: double.infinity, + child: Card( + margin: EdgeInsets.zero, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( children: [ - const Expanded( - child: Text("Auth Token: "), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Expanded( + child: Text("Installation Id: "), + ), + Expanded( + flex: 2, + child: Text(id), + ), + ], ), - Expanded( - flex: 2, - child: Text(authToken), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Expanded( + child: Text("Auth Token: "), + ), + Expanded( + flex: 2, + child: Text(authToken), + ), + ], ), ], ), - ], + ), ), ), - ), - ), - const SizedBox(height: 20), - SizedBox( - width: double.infinity, - child: ElevatedButton( - onPressed: getAuthToken, - child: const Text("Force update token"), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Expanded( + const SizedBox(height: 20), + SizedBox( + width: double.infinity, child: ElevatedButton( - onPressed: deleteId, - child: const Text("Delete ID"), + onPressed: () => getAuthToken(true), + child: const Text("Force update token"), ), ), - const SizedBox(width: 20), - Expanded( - child: ElevatedButton( - onPressed: getId, - child: const Text("Get ID"), - ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: ElevatedButton( + onPressed: deleteId, + child: const Text("Delete ID"), + ), + ), + const SizedBox(width: 20), + Expanded( + child: ElevatedButton( + onPressed: getId, + child: const Text("Get ID"), + ), + ) + ], ) ], - ) - ], + ), + ), ), ); } diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift index d6c89051db1d..468595c8ad79 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift +++ b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift @@ -3,34 +3,32 @@ import FirebaseInstallations class IdChangedStreamHandler: NSObject, FlutterStreamHandler { - var eventSink: FlutterEventSink? + + var eventSink: FlutterEventSink?; var installationIDObserver: NSObjectProtocol?; var instance:Installations; - var authToken:String = ""; + var installationsId:String = ""; init(instance: Installations) { self.instance = instance; } - @objc func handleInstallationIDChange() { - var events = Dictionary(); - - var installationsAuthToken:String = "" - - // Fetch new auth token - self.instance.authTokenForcingRefresh (true, completion: {(tokenResult:InstallationsAuthTokenResult?, error:Error?) in - if error != nil { - self.eventSink!(FlutterError()) - } - installationsAuthToken = tokenResult?.authToken ?? "" - if(installationsAuthToken != self.authToken) { - self.authToken = installationsAuthToken; - events["token"] = self.authToken; - self.eventSink!(events) + @objc func handleInstallationIDChange() { + var events = Dictionary(); + + // Fetch new installation Id + instance.installationID { (newId:String?, error:Error?) in + if error != nil { + self.eventSink!(FlutterError()) + } else { + if(newId != self.installationsId) { + self.installationsId = newId!; + events["token"] = self.installationsId; + self.eventSink!(events) + } + } } - - }); - } + } public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { eventSink = events From 936e84e0cb2a18d085eda2070afbd327fa4b769c Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Wed, 1 Dec 2021 17:58:36 +0300 Subject: [PATCH 16/51] fix: web registration & config --- .../firebase_installations/example/web/index.html | 7 ++++++- .../lib/firebase_installations_web.dart | 2 -- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/example/web/index.html b/packages/firebase_installations/firebase_installations/example/web/index.html index b829dda02342..437afed96230 100644 --- a/packages/firebase_installations/firebase_installations/example/web/index.html +++ b/packages/firebase_installations/firebase_installations/example/web/index.html @@ -1,5 +1,6 @@ + @@ -98,4 +102,5 @@ } - + + \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart index 4544aa2a86b3..48a88ff71bfc 100644 --- a/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart +++ b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart @@ -5,7 +5,6 @@ library firebase_installations_web; import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_core_web/firebase_core_web.dart'; import 'package:firebase_core_web/firebase_core_web_interop.dart' as core_interop; import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; @@ -35,7 +34,6 @@ class FirebaseInstallationsWeb extends FirebaseInstallationsPlatform { /// Create the default instance of the [FirebaseInstallationsPlatform] as a [FirebaseInstallationsWeb] static void registerWith(Registrar registrar) { - FirebaseCoreWeb.registerService('installations'); FirebaseInstallationsPlatform.instance = FirebaseInstallationsWeb.instance; } From edda52ed52324929ce5aed11df2a508b7c018e05 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Wed, 1 Dec 2021 17:59:05 +0300 Subject: [PATCH 17/51] teat: e2e tests --- .../example/pubspec.yaml | 15 +++--- .../example/test_driver/firebase_config.dart | 47 +++++++++++++++++++ .../firebase_installations_e2e.dart | 38 +++++++++++++++ .../firebase_installations_e2e_test.dart | 3 ++ 4 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations/example/test_driver/firebase_config.dart create mode 100644 packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart create mode 100644 packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e_test.dart diff --git a/packages/firebase_installations/firebase_installations/example/pubspec.yaml b/packages/firebase_installations/firebase_installations/example/pubspec.yaml index aafef8039b1a..b0cec0c2021e 100644 --- a/packages/firebase_installations/firebase_installations/example/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/example/pubspec.yaml @@ -27,18 +27,19 @@ environment: # the latest version available on pub.dev. To see which dependencies have newer # versions available, run `flutter pub outdated`. dependencies: - flutter: - sdk: flutter - firebase_core: + firebase_core: ^1.10.0 firebase_installations: path: ../ + flutter: + sdk: flutter dependency_overrides: firebase_core: path: ../../../firebase_core/firebase_core dev_dependencies: - flutter_test: + drive: ^1.0.0-1.0.nullsafety.1 + flutter_driver: sdk: flutter # The "flutter_lints" package below contains a set of recommended lints to @@ -47,28 +48,24 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^1.0.0 + test: any # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec - # The following section is specific to Flutter. flutter: # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true - # To add assets to your application, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg - # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. - # For details regarding adding assets from package dependencies, see # https://flutter.dev/assets-and-images/#from-packages - # To add custom fonts to your application, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a diff --git a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_config.dart b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_config.dart new file mode 100644 index 000000000000..79c0f4c5147c --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_config.dart @@ -0,0 +1,47 @@ +import 'dart:io'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; + +class TestFirebaseConfig { + static FirebaseOptions get platformOptions { + if (kIsWeb) { + // Web + return const FirebaseOptions( + apiKey: 'AIzaSyAgUhHU8wSJgO5MVNy95tMT07NEjzMOfz0', + authDomain: 'react-native-firebase-testing.firebaseapp.com', + databaseURL: 'https://react-native-firebase-testing.firebaseio.com', + projectId: 'react-native-firebase-testing', + storageBucket: 'react-native-firebase-testing.appspot.com', + messagingSenderId: '448618578101', + appId: '1:448618578101:web:0b650370bb29e29cac3efc', + measurementId: 'G-F79DJ0VFGS', + ); + } else if (Platform.isIOS || Platform.isMacOS) { + // iOS and MacOS + return const FirebaseOptions( + appId: '1:448618578101:ios:f7208957983eeee4ac3efc', + apiKey: 'AIzaSyAHAsf51D0A407EklG1bs-5wA7EbyfNFg0', + projectId: 'react-native-firebase-testing', + messagingSenderId: '448618578101', + iosBundleId: 'io.flutter.plugins.firebase.installations.example', + iosClientId: + '448618578101-ff6olegpc8901mthfv42r97oo0gbqebc.apps.googleusercontent.com', + androidClientId: + '448618578101-a9p7bj5jlakabp22fo3cbkj7nsmag24e.apps.googleusercontent.com', + databaseURL: 'https://react-native-firebase-testing.firebaseio.com', + storageBucket: 'react-native-firebase-testing.appspot.com', + ); + } else { + // Android + return const FirebaseOptions( + appId: '1:448618578101:android:a723be2eb2bf60d9ac3efc', + apiKey: 'AIzaSyCuu4tbv9CwwTudNOweMNstzZHIDBhgJxA', + projectId: 'react-native-firebase-testing', + messagingSenderId: '448618578101', + databaseURL: 'https://react-native-firebase-testing.firebaseio.com', + storageBucket: 'react-native-firebase-testing.appspot.com', + ); + } + } +} diff --git a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart new file mode 100644 index 000000000000..eafffbe5e5c1 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart @@ -0,0 +1,38 @@ +// Copyright 2020, 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. + +import 'package:drive/drive.dart' as drive; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_installations/firebase_installations.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'firebase_config.dart'; + +void testsMain() { + late FirebaseInstallations installations; + + setUpAll(() async { + await Firebase.initializeApp(options: TestFirebaseConfig.platformOptions); + installations = FirebaseInstallations.instance; + }); + + group('Installations ', () { + test('.getId', () async { + final id = await installations.getId(); + expect(id, isNotEmpty); + }); + test('.delete', () async { + final id = await installations.getId(); + await installations.delete(); + final newId = await installations.getId(); + expect(newId, isNot(equals(id))); + }); + test('.getToken', () async { + final token = await installations.getId(); + expect(token, isNotEmpty); + }); + }); +} + +void main() => drive.main(testsMain); diff --git a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e_test.dart b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e_test.dart new file mode 100644 index 000000000000..9940272d4af6 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e_test.dart @@ -0,0 +1,3 @@ +import 'package:drive/drive_driver.dart' as drive; + +void main() => drive.main(); From dfaf199ba6e503fc079083a8b5cf2a47224c1ac5 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Wed, 1 Dec 2021 18:01:29 +0300 Subject: [PATCH 18/51] chore: iOS example firebase service file reference --- .../example/ios/Runner.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj index d56e922c07ed..ca310f2b4e1e 100644 --- a/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/firebase_installations/firebase_installations/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,7 +8,7 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 25FA97EB27554A26002BC25E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 25FA97EA27554A26002BC25E /* GoogleService-Info.plist */; }; + 25D8824F2757C5A50032AD7D /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 25D8824E2757C5A40032AD7D /* GoogleService-Info.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -34,7 +34,7 @@ 0047649AA80D5E08710B83FC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 25FA97EA27554A26002BC25E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../../../../../../../Desktop/GoogleService-Info.plist"; sourceTree = ""; }; + 25D8824E2757C5A40032AD7D /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 46C9450C09DECE161F8D2B0E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 69B8F88D9874F0301253207A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -99,7 +99,7 @@ 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 25FA97EA27554A26002BC25E /* GoogleService-Info.plist */, + 25D8824E2757C5A40032AD7D /* GoogleService-Info.plist */, 97C147021CF9000F007C117D /* Info.plist */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, @@ -192,7 +192,7 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 25FA97EB27554A26002BC25E /* GoogleService-Info.plist in Resources */, + 25D8824F2757C5A50032AD7D /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); From 28046a55d934c18efbfb48f66d1055f9c133ed68 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Wed, 1 Dec 2021 18:49:08 +0300 Subject: [PATCH 19/51] chore: update auth token on idTokenChanged example app --- .../firebase_installations/example/lib/main.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart index 848a7e48f7f8..0737a0698e66 100644 --- a/packages/firebase_installations/firebase_installations/example/lib/main.dart +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -44,11 +44,16 @@ class _InstallationsCardState extends State { super.initState(); getAuthToken(); getId(); + + // Listen to changes FirebaseInstallations.instance.idTokenChanges.listen((event) { setState(() { id = event; }); + // Make sure that the Auth Token is updated once the Installation Id is updated + getAuthToken(); + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( content: Text('New Firebase Installations Id generated 🎉'), backgroundColor: Colors.green, From bcc491cd0096d0775c2eb95a268fb4fb84dec425 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Wed, 1 Dec 2021 19:16:52 +0300 Subject: [PATCH 20/51] test: adding github workflow --- .github/workflows/firebase_installations.yaml | 81 +++++++++++++++++++ .../example/pubspec.yaml | 2 +- 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/firebase_installations.yaml diff --git a/.github/workflows/firebase_installations.yaml b/.github/workflows/firebase_installations.yaml new file mode 100644 index 000000000000..cc35d07814f6 --- /dev/null +++ b/.github/workflows/firebase_installations.yaml @@ -0,0 +1,81 @@ +name: firebase_installations + +on: + pull_request: + paths: + - 'packages/firebase_installations/**' + - '.github/workflows/firebase_installations.yaml' + push: + branches: + - master + paths-ignore: + - 'docs/**' + - '**.md' + +env: + FLUTTERFIRE_PLUGIN_SCOPE: '*firebase_installations*' + FLUTTERFIRE_PLUGIN_SCOPE_EXAMPLE: '*firebase_installations_example*' + +jobs: + android: + runs-on: macos-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2.3.4 + with: + fetch-depth: 0 + - name: 'Install Flutter' + run: ./.github/workflows/scripts/install-flutter.sh stable + - name: 'Install Tools' + run: ./.github/workflows/scripts/install-tools.sh + - name: 'Build Example' + run: ./.github/workflows/scripts/build-example.sh android + - name: 'Drive Example' + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 28 + arch: x86_64 + # Firebase Core works without Google Play Services, so we don't use the `googleapis` + # emulator target as it's considerably slower on CI. + target: default + profile: Nexus 5X + script: ./.github/workflows/scripts/drive-example.sh android + + apple: + runs-on: macos-latest + timeout-minutes: 35 + steps: + - uses: actions/checkout@v2.3.4 + with: + fetch-depth: 0 + - name: 'Install Flutter' + run: ./.github/workflows/scripts/install-flutter.sh stable + - name: 'Install Tools' + run: | + ./.github/workflows/scripts/install-tools.sh + flutter config --enable-macos-desktop + - name: 'Build iOS Example' + run: ./.github/workflows/scripts/build-example.sh ios + - name: 'Drive iOS Example' + run: ./.github/workflows/scripts/drive-example.sh ios + # TODO(pr-mais): enable once macos is supported + # - name: 'Build MacOS Example' + # run: ./.github/workflows/scripts/build-example.sh macos + # - name: 'Drive MacOS Example' + # run: ./.github/workflows/scripts/drive-example.sh macos + + web: + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v2.3.4 + with: + fetch-depth: 0 + - name: 'Install Flutter' + run: ./.github/workflows/scripts/install-flutter.sh stable + - name: 'Install Tools' + run: | + ./.github/workflows/scripts/install-tools.sh + flutter config --enable-web + - name: 'Drive Example' + run: ./.github/workflows/scripts/drive-example.sh web diff --git a/packages/firebase_installations/firebase_installations/example/pubspec.yaml b/packages/firebase_installations/firebase_installations/example/pubspec.yaml index b0cec0c2021e..708b85541971 100644 --- a/packages/firebase_installations/firebase_installations/example/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/example/pubspec.yaml @@ -1,4 +1,4 @@ -name: example +name: firebase_installations_example description: A new Flutter project. # The following line prevents the package from being accidentally published to From 0dff9d17ae66ac96653a5bb502cd0fdc890c54d6 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Wed, 1 Dec 2021 22:29:35 +0300 Subject: [PATCH 21/51] chore: fix web drive tests --- .../example/test_driver/firebase_installations_e2e.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart index eafffbe5e5c1..8181bc829954 100644 --- a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart +++ b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart @@ -25,6 +25,10 @@ void testsMain() { test('.delete', () async { final id = await installations.getId(); await installations.delete(); + + // Wait a little so we don't get a delete-pending exception + await Future.delayed(const Duration(seconds: 3)); + final newId = await installations.getId(); expect(newId, isNot(equals(id))); }); From 5c9daa006de1009eb081dbb1c9721581410d30b5 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Thu, 2 Dec 2021 14:44:36 +0300 Subject: [PATCH 22/51] test: adding unit tests --- .../example/lib/main.dart | 2 +- .../firebase_installations/pubspec.yaml | 1 + .../test/firebase_installations_test.dart | 132 ++++++++++++++++-- ...installations_platform_interface_test.dart | 12 -- .../firebase_installations_web/pubspec.yaml | 4 +- .../test/firebase_installations_web_test.dart | 12 -- 6 files changed, 128 insertions(+), 35 deletions(-) delete mode 100644 packages/firebase_installations/firebase_installations_platform_interface/test/firebase_installations_platform_interface_test.dart delete mode 100644 packages/firebase_installations/firebase_installations_web/test/firebase_installations_web_test.dart diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart index 0737a0698e66..bf27584d35f0 100644 --- a/packages/firebase_installations/firebase_installations/example/lib/main.dart +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -1,6 +1,6 @@ import 'dart:developer'; -import 'package:example/firebase_config.dart'; +import 'package:firebase_installations_example/firebase_config.dart'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; diff --git a/packages/firebase_installations/firebase_installations/pubspec.yaml b/packages/firebase_installations/firebase_installations/pubspec.yaml index 3f21f6503845..45378f3b74e9 100644 --- a/packages/firebase_installations/firebase_installations/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/pubspec.yaml @@ -21,6 +21,7 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter + mockito: ^5.0.16 plugin_platform_interface: ^2.0.0 test: any diff --git a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart index 777d91692001..c05b2928e33a 100644 --- a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart +++ b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart @@ -1,19 +1,135 @@ +// ignore_for_file: require_trailing_commas +// 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. + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; +import 'package:firebase_installations/firebase_installations.dart'; +import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_installations/firebase_installations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +typedef Callback = Function(MethodCall call); +final mockInstallations = MockFirebaseInstallations(); void main() { - const MethodChannel channel = MethodChannel('firebase_installations'); + setupFirebaseInstallationsMocks(); - TestWidgetsFlutterBinding.ensureInitialized(); + late FirebaseInstallations installations; + FirebaseInstallationsPlatform.instance = mockInstallations; + group('$FirebaseInstallations', () { + setUpAll(() async { + await Firebase.initializeApp(); + installations = FirebaseInstallations.instance; + when(mockInstallations.delegateFor( + app: anyNamed('app'), + )).thenAnswer((_) => mockInstallations); + when(mockInstallations.getId()).thenAnswer( + (_) => Future.value('some-id'), + ); + }); - setUp(() { - channel.setMockMethodCallHandler((MethodCall methodCall) async { - return '42'; + test('getId', () async { + await installations.getId(); + verify(mockInstallations.getId()); + }); + test('getAuthToken', () async { + await installations.getToken(); + verify(mockInstallations.getToken(false)); + }); + test('delete', () async { + await installations.delete(); + verify(mockInstallations.delete()); }); }); +} + +void setupFirebaseInstallationsMocks([Callback? customHandlers]) { + TestWidgetsFlutterBinding.ensureInitialized(); - tearDown(() { - channel.setMockMethodCallHandler(null); + MethodChannelFirebase.channel.setMockMethodCallHandler((call) async { + if (call.method == 'Firebase#initializeCore') { + return [ + { + 'name': defaultFirebaseAppName, + 'options': { + 'apiKey': '123', + 'appId': '123', + 'messagingSenderId': '123', + 'projectId': '123', + }, + 'pluginConstants': {}, + } + ]; + } + + if (call.method == 'Firebase#initializeApp') { + return { + 'name': call.arguments['appName'], + 'options': call.arguments['options'], + 'pluginConstants': {}, + }; + } + + if (customHandlers != null) { + customHandlers(call); + } + + return null; }); } + +class MockFirebaseInstallations extends Mock + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin + implements + TestFirebaseInstallationsPlatform { + @override + TestFirebaseInstallationsPlatform delegateFor({FirebaseApp? app}) { + return super.noSuchMethod( + Invocation.method(#delegateFor, [], {#app: app}), + returnValue: TestFirebaseInstallationsPlatform(app), + returnValueForMissingStub: TestFirebaseInstallationsPlatform(app), + ); + } + + @override + Future getId() { + return super.noSuchMethod( + Invocation.method(#getId, []), + returnValue: Future.value(''), + returnValueForMissingStub: Future.value(''), + ); + } + + @override + Future getToken([forceRefresh = false]) { + return super.noSuchMethod( + Invocation.method(#getToken, [forceRefresh]), + returnValue: Future.value(''), + returnValueForMissingStub: Future.value(''), + ); + } + + @override + Future delete() { + return super.noSuchMethod( + Invocation.method(#getId, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value(), + ); + } +} + +class TestFirebaseInstallationsPlatform extends FirebaseInstallationsPlatform { + TestFirebaseInstallationsPlatform(FirebaseApp? app) : super(app); + + @override + TestFirebaseInstallationsPlatform delegateFor({FirebaseApp? app}) { + return this; + } +} diff --git a/packages/firebase_installations/firebase_installations_platform_interface/test/firebase_installations_platform_interface_test.dart b/packages/firebase_installations/firebase_installations_platform_interface/test/firebase_installations_platform_interface_test.dart deleted file mode 100644 index fa82a2985c50..000000000000 --- a/packages/firebase_installations/firebase_installations_platform_interface/test/firebase_installations_platform_interface_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; - -void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); - }); -} diff --git a/packages/firebase_installations/firebase_installations_web/pubspec.yaml b/packages/firebase_installations/firebase_installations_web/pubspec.yaml index 13ad826b418d..b1f0393d953d 100644 --- a/packages/firebase_installations/firebase_installations_web/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations_web/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/f repository: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations_web environment: - sdk: ">=2.12.0 <3.0.0" - flutter: ">=1.17.0" + sdk: '>=2.12.0 <3.0.0' + flutter: '>=1.17.0' dependencies: firebase_installations_platform_interface: ^0.0.1 diff --git a/packages/firebase_installations/firebase_installations_web/test/firebase_installations_web_test.dart b/packages/firebase_installations/firebase_installations_web/test/firebase_installations_web_test.dart deleted file mode 100644 index 8c21027e68e1..000000000000 --- a/packages/firebase_installations/firebase_installations_web/test/firebase_installations_web_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:firebase_installations_web/firebase_installations_web.dart'; - -void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); - }); -} From 2474cf79062a4dbe9cb120de9c3b3c16e9864b5e Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 01:19:48 +0300 Subject: [PATCH 23/51] chore: run format --- .../analysis_options.yaml | 4 - .../FirebaseInstallationsPlugin.java | 90 +++++++++---------- .../FlutterFirebaseAppRegistrar.java | 3 +- .../TokenChannelStreamHandler.java | 9 +- .../ios/Classes/FirebaseInstallationsPlugin.h | 2 +- .../ios/Classes/FirebaseInstallationsPlugin.m | 21 +++-- .../ios/Classes/FLTFirebaseMessagingPlugin.m | 2 +- 7 files changed, 56 insertions(+), 75 deletions(-) delete mode 100644 packages/firebase_installations/firebase_installations/analysis_options.yaml diff --git a/packages/firebase_installations/firebase_installations/analysis_options.yaml b/packages/firebase_installations/firebase_installations/analysis_options.yaml deleted file mode 100644 index a5744c1cfbe7..000000000000 --- a/packages/firebase_installations/firebase_installations/analysis_options.yaml +++ /dev/null @@ -1,4 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java index 9f8946367fc6..0b237acfae4b 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java @@ -1,19 +1,12 @@ package io.flutter.plugins.firebase.installations.firebase_installations; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; import com.google.firebase.installations.FirebaseInstallations; import com.google.firebase.installations.InstallationTokenResult; -import com.google.firebase.installations.internal.FidListener; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.EventChannel; @@ -23,27 +16,26 @@ import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugins.firebase.core.FlutterFirebasePlugin; import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; -/** - * FirebaseInstallationsPlugin - */ -public class FirebaseInstallationsPlugin implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler { +/** FirebaseInstallationsPlugin */ +public class FirebaseInstallationsPlugin + implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler { private MethodChannel channel; private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_installations"; private final Map streamHandlers = new HashMap<>(); - @Nullable - private BinaryMessenger messenger; + @Nullable private BinaryMessenger messenger; private MethodChannel setup(BinaryMessenger binaryMessenger) { - final MethodChannel channel = - new MethodChannel(binaryMessenger, METHOD_CHANNEL_NAME); + final MethodChannel channel = new MethodChannel(binaryMessenger, METHOD_CHANNEL_NAME); channel.setMethodCallHandler(this); this.messenger = binaryMessenger; return channel; } - @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { BinaryMessenger binaryMessenger = flutterPluginBinding.getBinaryMessenger(); @@ -59,7 +51,6 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { messenger = null; removeEventListeners(); - } private FirebaseInstallations getInstallations(Map arguments) { @@ -74,31 +65,32 @@ private Task getId(Map arguments) { private Task getToken(Map arguments) { return Tasks.call( - cachedThreadPool, - () -> { - FirebaseInstallations firebaseInstallations = getInstallations(arguments); - Boolean forceRefresh = (Boolean) Objects.requireNonNull(arguments.get("forceRefresh")); - InstallationTokenResult tokenResult = Tasks.await(firebaseInstallations.getToken(forceRefresh)); - return tokenResult.getToken(); - }); + cachedThreadPool, + () -> { + FirebaseInstallations firebaseInstallations = getInstallations(arguments); + Boolean forceRefresh = (Boolean) Objects.requireNonNull(arguments.get("forceRefresh")); + InstallationTokenResult tokenResult = + Tasks.await(firebaseInstallations.getToken(forceRefresh)); + return tokenResult.getToken(); + }); } private Task registerTokenListener(Map arguments) { return Tasks.call( - cachedThreadPool, - () -> { - String appName = (String) Objects.requireNonNull(arguments.get("appName")); - FirebaseInstallations firebaseInstallations = getInstallations(arguments); + cachedThreadPool, + () -> { + String appName = (String) Objects.requireNonNull(arguments.get("appName")); + FirebaseInstallations firebaseInstallations = getInstallations(arguments); - TokenChannelStreamHandler handler = new TokenChannelStreamHandler(firebaseInstallations); + TokenChannelStreamHandler handler = new TokenChannelStreamHandler(firebaseInstallations); - final String name = METHOD_CHANNEL_NAME + "/token/" + appName; - final EventChannel channel = new EventChannel(messenger, name); - channel.setStreamHandler(handler); - streamHandlers.put(channel, handler); + final String name = METHOD_CHANNEL_NAME + "/token/" + appName; + final EventChannel channel = new EventChannel(messenger, name); + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); - return name; - }); + return name; + }); } private Task deleteId(Map arguments) { @@ -126,21 +118,20 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { default: result.notImplemented(); return; - } methodCallTask.addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - result.success(task.getResult()); - } else { - Exception exception = task.getException(); - result.error( - "firebase_installations", - exception != null ? exception.getMessage() : null, - getExceptionDetails(exception)); - } - }); + task -> { + if (task.isSuccessful()) { + result.success(task.getResult()); + } else { + Exception exception = task.getException(); + result.error( + "firebase_installations", + exception != null ? exception.getMessage() : null, + getExceptionDetails(exception)); + } + }); } private Map getExceptionDetails(@Nullable Exception exception) { @@ -154,7 +145,6 @@ private Map getExceptionDetails(@Nullable Exception exception) { return details; } - @Override public Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { return Tasks.call(cachedThreadPool, () -> null); diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java index 4eef816fabb2..ff8becf25d7b 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java @@ -3,6 +3,7 @@ // found in the LICENSE file. package io.flutter.plugins.firebase.installations.firebase_installations; + import androidx.annotation.Keep; import com.google.firebase.components.Component; import com.google.firebase.components.ComponentRegistrar; @@ -15,6 +16,6 @@ public class FlutterFirebaseAppRegistrar implements ComponentRegistrar { @Override public List> getComponents() { return Collections.>singletonList( - LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); + LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); } } diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java index 82025d105b3f..39a55dba7c84 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java @@ -1,16 +1,12 @@ package io.flutter.plugins.firebase.installations.firebase_installations; -import androidx.annotation.NonNull; import com.google.firebase.installations.FirebaseInstallations; import com.google.firebase.installations.internal.FidListener; - +import io.flutter.plugin.common.EventChannel; import java.util.HashMap; import java.util.Map; -import io.flutter.Log; -import io.flutter.plugin.common.EventChannel; - public class TokenChannelStreamHandler implements EventChannel.StreamHandler { private final FirebaseInstallations firebaseInstallations; @@ -25,7 +21,6 @@ public void onListen(Object arguments, EventChannel.EventSink events) { listener = createTokenEventListener(events); - firebaseInstallations.registerFidListener(listener); } @@ -40,7 +35,7 @@ FidListener createTokenEventListener(final EventChannel.EventSink events) { return token -> { Map event = new HashMap<>(); - event.put("token" , token); + event.put("token", token); events.success(event); }; diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h index 31d7414acd83..e1c9a70eddc6 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h @@ -1,5 +1,5 @@ #import #import -@interface FirebaseInstallationsPlugin : FLTFirebasePlugin +@interface FirebaseInstallationsPlugin : FLTFirebasePlugin @end diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m index a3525542d0f7..2e10e8ea08ad 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m @@ -13,25 +13,24 @@ + (void)registerWithRegistrar:(NSObject*)registrar { [SwiftFirebaseInstallationsPlugin registerWithRegistrar:registrar]; } -- (void)didReinitializeFirebaseCore:(void (^ _Nonnull)(void))completion { - completion(); +- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { + completion(); } -- (NSString * _Nonnull)firebaseLibraryName { - return LIBRARY_NAME; +- (NSString* _Nonnull)firebaseLibraryName { + return LIBRARY_NAME; } -- (NSString * _Nonnull)firebaseLibraryVersion { - return LIBRARY_VERSION; +- (NSString* _Nonnull)firebaseLibraryVersion { + return LIBRARY_VERSION; } -- (NSString * _Nonnull)flutterChannelName { - return @"plugins.flutter.io/firebase_installations"; +- (NSString* _Nonnull)flutterChannelName { + return @"plugins.flutter.io/firebase_installations"; } -- (NSDictionary * _Nonnull)pluginConstantsForFIRApp:(FIRApp * _Nonnull)firebaseApp { - return @{}; +- (NSDictionary* _Nonnull)pluginConstantsForFIRApp:(FIRApp* _Nonnull)firebaseApp { + return @{}; } @end - diff --git a/packages/firebase_messaging/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m b/packages/firebase_messaging/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m index 8ee1dcb2089f..3523a83948ca 100644 --- a/packages/firebase_messaging/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m +++ b/packages/firebase_messaging/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m @@ -180,7 +180,7 @@ - (void)messaging:(nonnull FIRMessaging *)messaging if ([[GULAppDelegateSwizzler sharedApplication].delegate respondsToSelector:messaging_didReceiveRegistrationTokenSelector]) { void (*usersDidReceiveRegistrationTokenIMP)(id, SEL, FIRMessaging *, NSString *) = - (typeof(usersDidReceiveRegistrationTokenIMP)) & objc_msgSend; + (typeof(usersDidReceiveRegistrationTokenIMP))&objc_msgSend; usersDidReceiveRegistrationTokenIMP([GULAppDelegateSwizzler sharedApplication].delegate, messaging_didReceiveRegistrationTokenSelector, messaging, fcmToken); From 68ebc091fe8564fb6642b6b8dd2b612a88ea87ec Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 01:20:24 +0300 Subject: [PATCH 24/51] chore: experimenting test on CI --- .../example/test_driver/firebase_installations_e2e.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart index 8181bc829954..1f2f6b0ab45c 100644 --- a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart +++ b/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart @@ -24,10 +24,14 @@ void testsMain() { }); test('.delete', () async { final id = await installations.getId(); + + // Wait a little so we don't get a delete-pending exception + await Future.delayed(const Duration(seconds: 8)); + await installations.delete(); // Wait a little so we don't get a delete-pending exception - await Future.delayed(const Duration(seconds: 3)); + await Future.delayed(const Duration(seconds: 8)); final newId = await installations.getId(); expect(newId, isNot(equals(id))); From d64351bf78f16b6f88c357719197c1a0421315bf Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 14:04:26 +0300 Subject: [PATCH 25/51] feat: macos support --- .../macos/Runner.xcodeproj/project.pbxproj | 67 ++++++- .../contents.xcworkspacedata | 3 + .../macos/Runner/DebugProfile.entitlements | 2 + .../ios/Classes/FirebaseInstallationsPlugin.h | 8 + .../Classes/FirebaseInstallationsPlugin.h | 12 ++ .../Classes/FirebaseInstallationsPlugin.m | 36 ++++ .../Classes/IdChangedStreamHandler.swift | 54 ++++++ .../SwiftFirebaseInstallationsPlugin.swift | 172 ++++++++++++++++++ .../macos/firebase_installations.podspec | 68 +++++++ .../firebase_installations/pubspec.yaml | 2 + 10 files changed, 420 insertions(+), 4 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h create mode 100644 packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m create mode 100644 packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift create mode 100644 packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift create mode 100644 packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.pbxproj b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.pbxproj index cc89c8782812..09bd291b065e 100644 --- a/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.pbxproj +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + CECC36D088977FEA6F4C1003 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE8B6589603437F8EF35345E /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -52,9 +53,10 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 1779DABB40E431F6140D7937 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -66,8 +68,11 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 6D913916A8D84C1FDC8F7B4C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7234BB708D5460BA64D90E26 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + BE8B6589603437F8EF35345E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -75,12 +80,23 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CECC36D088977FEA6F4C1003 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1C79AB84644B94FC4355DDDB /* Pods */ = { + isa = PBXGroup; + children = ( + 6D913916A8D84C1FDC8F7B4C /* Pods-Runner.debug.xcconfig */, + 7234BB708D5460BA64D90E26 /* Pods-Runner.release.xcconfig */, + 1779DABB40E431F6140D7937 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; 33BA886A226E78AF003329D5 /* Configs */ = { isa = PBXGroup; children = ( @@ -99,6 +115,7 @@ 33CEB47122A05771004F2AC0 /* Flutter */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, + 1C79AB84644B94FC4355DDDB /* Pods */, ); sourceTree = ""; }; @@ -148,6 +165,7 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( + BE8B6589603437F8EF35345E /* Pods_Runner.framework */, ); name = Frameworks; sourceTree = ""; @@ -159,11 +177,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + A2B5BA26A8ECD333A76C446C /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, + 9B0D0C0196D50B117C72597B /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,6 +290,45 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + 9B0D0C0196D50B117C72597B /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + A2B5BA26A8ECD333A76C446C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -344,7 +403,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -423,7 +482,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -470,7 +529,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16ed0f..21a3cc14c74e 100644 --- a/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/packages/firebase_installations/firebase_installations/example/macos/Runner/DebugProfile.entitlements b/packages/firebase_installations/firebase_installations/example/macos/Runner/DebugProfile.entitlements index dddb8a30c851..3ba6c1266f21 100644 --- a/packages/firebase_installations/firebase_installations/example/macos/Runner/DebugProfile.entitlements +++ b/packages/firebase_installations/firebase_installations/example/macos/Runner/DebugProfile.entitlements @@ -6,6 +6,8 @@ com.apple.security.cs.allow-jit + com.apple.security.network.client + com.apple.security.network.server diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h index e1c9a70eddc6..1811e3441d5e 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h @@ -1,4 +1,12 @@ +#import + +#import +#if TARGET_OS_OSX +#import +#else #import +#endif + #import @interface FirebaseInstallationsPlugin : FLTFirebasePlugin diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h new file mode 100644 index 000000000000..57c623a35516 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h @@ -0,0 +1,12 @@ +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import + +@interface FirebaseInstallationsPlugin : FLTFirebasePlugin +@end diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m new file mode 100644 index 000000000000..2e10e8ea08ad --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m @@ -0,0 +1,36 @@ +#import "FirebaseInstallationsPlugin.h" +#if __has_include() +#import +#else +// Support project import fallback if the generated compatibility header +// is not copied when this plugin is created as a library. +// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 +#import "firebase_installations-Swift.h" +#endif + +@implementation FirebaseInstallationsPlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + [SwiftFirebaseInstallationsPlugin registerWithRegistrar:registrar]; +} + +- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { + completion(); +} + +- (NSString* _Nonnull)firebaseLibraryName { + return LIBRARY_NAME; +} + +- (NSString* _Nonnull)firebaseLibraryVersion { + return LIBRARY_VERSION; +} + +- (NSString* _Nonnull)flutterChannelName { + return @"plugins.flutter.io/firebase_installations"; +} + +- (NSDictionary* _Nonnull)pluginConstantsForFIRApp:(FIRApp* _Nonnull)firebaseApp { + return @{}; +} + +@end diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift b/packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift new file mode 100644 index 000000000000..468595c8ad79 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift @@ -0,0 +1,54 @@ +import Foundation +import FirebaseInstallations + +class IdChangedStreamHandler: NSObject, FlutterStreamHandler { + + + var eventSink: FlutterEventSink?; + var installationIDObserver: NSObjectProtocol?; + var instance:Installations; + var installationsId:String = ""; + + init(instance: Installations) { + self.instance = instance; + } + + @objc func handleInstallationIDChange() { + var events = Dictionary(); + + // Fetch new installation Id + instance.installationID { (newId:String?, error:Error?) in + if error != nil { + self.eventSink!(FlutterError()) + } else { + if(newId != self.installationsId) { + self.installationsId = newId!; + events["token"] = self.installationsId; + self.eventSink!(events) + } + } + } + } + + public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { + eventSink = events + + // [START handle_installation_id_change] + installationIDObserver = NotificationCenter.default.addObserver( + forName: .InstallationIDDidChange, + object: nil, + queue: nil + ) { (notification) in + self.handleInstallationIDChange() + } + // [END handle_installation_id_change] + + return nil + } + + public func onCancel(withArguments arguments: Any?) -> FlutterError? { + self.eventSink = nil + return nil + } + +} diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift new file mode 100644 index 000000000000..d487c4b8381a --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift @@ -0,0 +1,172 @@ +import FlutterMacOS +import firebase_core +import FirebaseInstallations + +let kFLTFirebaseInstallationsChannelName = "plugins.flutter.io/firebase_installations"; + +public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin { + + private var eventSink: FlutterEventSink? + private var messenger:FlutterBinaryMessenger; + + var result:FLTFirebaseMethodCallResult?; + var streamHandler = Dictionary(); + + var args = NSDictionary.init(); + + init(messenger:FlutterBinaryMessenger) { + self.messenger = messenger; + } + + public static func register(with registrar: FlutterPluginRegistrar) { + let channel = FlutterMethodChannel(name: kFLTFirebaseInstallationsChannelName, binaryMessenger: registrar.messenger) + let instance = SwiftFirebaseInstallationsPlugin(messenger: registrar.messenger) + registrar.addMethodCallDelegate(instance, channel: channel) + } + + @objc private func onIdChanged(notification: NSNotification) { + print("changed") + } + + /// Gets Installations instance for a Firebase App. + /// - Returns: a Firebase Installations instance for the passed app from Dart + internal func getInstallations() -> Installations { + let appName = FLTFirebasePlugin.firebaseAppName(fromDartName: (args["appName"] as! String)) + let app:FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(appName)! + return Installations.installations(app: app) + } + + /// Gets Installations Id for an instance. + /// - Parameter arguments: the arguments passed by the Dart calling method + /// - Parameter result: the result instance used to send the result to Dart. + internal func getId() { + let instance:Installations = getInstallations(); + + var installationsId:String = "" + + instance.installationID { (id:String?, error:Error?) in + if error != nil { + self.result!.error(nil, nil, nil, error) + } else { + installationsId = id ?? "" + NSLog("Firebase Installation ID: %@", installationsId) + + self.result!.success(id) + } + + + } + } + + /// Deletes Installations Id for an instance. + internal func deleteId() { + let instance:Installations = getInstallations(); + + instance.delete { (error:Error?) in + if error != nil { + self.result!.error(nil, nil, nil, error) + } else { + NSLog("Firebase Installation ID deleted successfully.") + self.result!.success(nil) + } + } + + } + + /// Gets the token Id for an instance. + internal func getToken() { + let instance:Installations = getInstallations(); + + var installationsAuthToken:String = "" + + let forceRefresh:Bool = (args["forceRefresh"] as? Bool) ?? false; + + instance.authTokenForcingRefresh (forceRefresh, completion: {(tokenResult:InstallationsAuthTokenResult?, error:Error?) in + if error != nil { + self.result!.error(nil, nil, nil, error) + } else { + installationsAuthToken = tokenResult?.authToken ?? "" + + NSLog("Firebase Installation Auth Token: %@", installationsAuthToken) + + self.result!.success(installationsAuthToken) + } + }); + } + + /// Starts listening to Installation ID events for an instance. + internal func registerTokenListener() { + let instance:Installations = getInstallations(); + + let appName = (args["appName"] as! String) + let eventChannelName:String = kFLTFirebaseInstallationsChannelName + "/token/" + appName; + + let eventChannel = FlutterEventChannel(name: eventChannelName, binaryMessenger: messenger) + + if (self.streamHandler[eventChannelName] == nil) { + self.streamHandler[eventChannelName] = IdChangedStreamHandler(instance: instance) + } + + eventChannel.setStreamHandler((self.streamHandler[eventChannelName]!)) + + result?.success(eventChannelName) + } + + + internal func mapInstallationsErrorCodes(code:UInt) -> NSString { + let error = InstallationsErrorCode.init(rawValue: code) ?? InstallationsErrorCode.unknown; + + switch error { + case InstallationsErrorCode.invalidConfiguration: + return "invalid-configuration"; + case InstallationsErrorCode.keychain: + return "invalid-keychain"; + case InstallationsErrorCode.serverUnreachable: + return "server-unreachable"; + case InstallationsErrorCode.unknown: + return "unknown"; + default: + return "unknown"; + } + } + + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + let args = call.arguments as! NSDictionary + + let errorBlock:FLTFirebaseMethodCallErrorBlock = { (code, message, details, error:Error?) in + var errorDetails:Dictionary = Dictionary(); + + errorDetails["code"] = code ?? self.mapInstallationsErrorCodes(code:UInt((error! as NSError).code)) + errorDetails["message"] = message ?? error?.localizedDescription ?? "An unknown error has occurred."; + errorDetails["additionalData"] = details + + + if(code == "unknown") { + NSLog("FLTFirebaseInstallations: An error occured while calling method %@", call.method) + } + + result(FLTFirebasePlugin.createFlutterError(fromCode: errorDetails["code"] as! String, + message: errorDetails["message"] as! String, + optionalDetails: (errorDetails["additionalData"] as? [AnyHashable : Any]), + andOptionalNSError: error)) + }; + + self.result = .create(success: result, andErrorBlock: errorBlock) + self.args = args + + switch (call.method) { + case "FirebaseInstallations#getId": + getId() + case "FirebaseInstallations#delete": + deleteId() + case "FirebaseInstallations#getToken": + getToken() + case "FirebaseInstallations#registerIdTokenListener": + registerTokenListener() + default: + result(FlutterMethodNotImplemented) + } + + } +} diff --git a/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec b/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec new file mode 100644 index 000000000000..0cab683fe6ff --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec @@ -0,0 +1,68 @@ +require 'yaml' + +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + +begin + required_macos_version = "10.12" + current_target_definition = Pod::Config.instance.podfile.send(:current_target_definition) + user_osx_target = current_target_definition.to_hash["platform"]["osx"] + if (Gem::Version.new(user_osx_target) < Gem::Version.new(required_macos_version)) + error_message = "The FlutterFire plugin #{pubspec['name']} for macOS requires a macOS deployment target of #{required_macos_version} or later." + Pod::UI.warn error_message, [ + "Update the `platform :osx, '#{user_osx_target}'` line in your macOS/Podfile to version `#{required_macos_version}` and ensure you commit this file.", + "Open your `macos/Runner.xcodeproj` Xcode project and under the 'Runner' target General tab set your Deployment Target to #{required_macos_version} or later." + ] + raise Pod::Informative, error_message + end +rescue Pod::Informative + raise +rescue + # Do nothing for all other errors and let `pod install` deal with any issues. +end + +Pod::Spec.new do |s| + s.name = 'firebase_installations' + s.version = '0.0.1' + s.summary = 'A new flutter plugin project.' + s.description = <<-DESC +A new flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/*.h' + + s.platform = :osx, '10.12' + + s.swift_version = '5.5' + + s.dependency 'FlutterMacOS' + + # Firebase dependencies + s.dependency 'firebase_core' + s.dependency 'Firebase/CoreOnly', "~> #{firebase_sdk_version}" + s.dependency 'Firebase/Installations', "~> #{firebase_sdk_version}" + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\@\\\"#{library_version}\\\" LIBRARY_NAME=\\@\\\"flutter-fire-rtdb\\\"", + 'DEFINES_MODULE' => 'YES' + } +end diff --git a/packages/firebase_installations/firebase_installations/pubspec.yaml b/packages/firebase_installations/firebase_installations/pubspec.yaml index 45378f3b74e9..6dc2adb41772 100644 --- a/packages/firebase_installations/firebase_installations/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/pubspec.yaml @@ -33,3 +33,5 @@ flutter: pluginClass: FirebaseInstallationsPlugin ios: pluginClass: FirebaseInstallationsPlugin + macos: + pluginClass: FirebaseInstallationsPlugin From eabd1fe4273ab6b8af8aab3e2235325470f19a58 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 14:05:21 +0300 Subject: [PATCH 26/51] feat: github macos workflow --- .github/workflows/firebase_installations.yaml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/firebase_installations.yaml b/.github/workflows/firebase_installations.yaml index cc35d07814f6..314d6eeb4f8a 100644 --- a/.github/workflows/firebase_installations.yaml +++ b/.github/workflows/firebase_installations.yaml @@ -58,11 +58,10 @@ jobs: run: ./.github/workflows/scripts/build-example.sh ios - name: 'Drive iOS Example' run: ./.github/workflows/scripts/drive-example.sh ios - # TODO(pr-mais): enable once macos is supported - # - name: 'Build MacOS Example' - # run: ./.github/workflows/scripts/build-example.sh macos - # - name: 'Drive MacOS Example' - # run: ./.github/workflows/scripts/drive-example.sh macos + - name: 'Build MacOS Example' + run: ./.github/workflows/scripts/build-example.sh macos + - name: 'Drive MacOS Example' + run: ./.github/workflows/scripts/drive-example.sh macos web: runs-on: ubuntu-latest From afb189fc1449f76587b681a514c9ff5fdf78cc95 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 14:17:40 +0300 Subject: [PATCH 27/51] fix: iOS failing --- .../ios/Classes/FirebaseInstallationsPlugin.h | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h index 1811e3441d5e..57c623a35516 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h @@ -1,6 +1,5 @@ #import -#import #if TARGET_OS_OSX #import #else From 0f91949b00eb07132f55e654ea41e8cb09953451 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 16:48:30 +0300 Subject: [PATCH 28/51] chore: macOS/iOS conditional imports --- .../SwiftFirebaseInstallationsPlugin.swift | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift index 1f07793c12f6..aca91e9574fa 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift +++ b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift @@ -1,5 +1,9 @@ +#if canImport(FlutterMacOS) +import FlutterMacOS +#else import Flutter -import UIKit +#endif + import firebase_core import FirebaseInstallations @@ -20,8 +24,16 @@ public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin } public static func register(with registrar: FlutterPluginRegistrar) { - let channel = FlutterMethodChannel(name: kFLTFirebaseInstallationsChannelName, binaryMessenger: registrar.messenger()) - let instance = SwiftFirebaseInstallationsPlugin(messenger: registrar.messenger()) + let binaryMessenger:FlutterBinaryMessenger; + + #if os(macOS) + binaryMessenger = registrar.messenger + #elseif os(iOS) + binaryMessenger = registrar.messenger() + #endif + + let channel = FlutterMethodChannel(name: kFLTFirebaseInstallationsChannelName, binaryMessenger: binaryMessenger) + let instance = SwiftFirebaseInstallationsPlugin(messenger: binaryMessenger) registrar.addMethodCallDelegate(instance, channel: channel) } @@ -55,7 +67,7 @@ public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin self.result!.success(id) } - + } } From 997b69d04297a2b2bb5187dac5e8f5892c361ad1 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 16:55:41 +0300 Subject: [PATCH 29/51] chore: macOS linked files --- .../Classes/FirebaseInstallationsPlugin.h | 13 +- .../Classes/FirebaseInstallationsPlugin.m | 37 +--- .../Classes/IdChangedStreamHandler.swift | 55 +----- .../SwiftFirebaseInstallationsPlugin.swift | 173 +----------------- 4 files changed, 4 insertions(+), 274 deletions(-) mode change 100644 => 120000 packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h mode change 100644 => 120000 packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m mode change 100644 => 120000 packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift mode change 100644 => 120000 packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h deleted file mode 100644 index 57c623a35516..000000000000 --- a/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h +++ /dev/null @@ -1,12 +0,0 @@ -#import - -#if TARGET_OS_OSX -#import -#else -#import -#endif - -#import - -@interface FirebaseInstallationsPlugin : FLTFirebasePlugin -@end diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h new file mode 120000 index 000000000000..cf1e960c6ebf --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.h @@ -0,0 +1 @@ +../../ios/Classes/FirebaseInstallationsPlugin.h \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m deleted file mode 100644 index 2e10e8ea08ad..000000000000 --- a/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m +++ /dev/null @@ -1,36 +0,0 @@ -#import "FirebaseInstallationsPlugin.h" -#if __has_include() -#import -#else -// Support project import fallback if the generated compatibility header -// is not copied when this plugin is created as a library. -// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 -#import "firebase_installations-Swift.h" -#endif - -@implementation FirebaseInstallationsPlugin -+ (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftFirebaseInstallationsPlugin registerWithRegistrar:registrar]; -} - -- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { - completion(); -} - -- (NSString* _Nonnull)firebaseLibraryName { - return LIBRARY_NAME; -} - -- (NSString* _Nonnull)firebaseLibraryVersion { - return LIBRARY_VERSION; -} - -- (NSString* _Nonnull)flutterChannelName { - return @"plugins.flutter.io/firebase_installations"; -} - -- (NSDictionary* _Nonnull)pluginConstantsForFIRApp:(FIRApp* _Nonnull)firebaseApp { - return @{}; -} - -@end diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m new file mode 120000 index 000000000000..f671f2938a28 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.m @@ -0,0 +1 @@ +../../ios/Classes/FirebaseInstallationsPlugin.m \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift b/packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift deleted file mode 100644 index 468595c8ad79..000000000000 --- a/packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift +++ /dev/null @@ -1,54 +0,0 @@ -import Foundation -import FirebaseInstallations - -class IdChangedStreamHandler: NSObject, FlutterStreamHandler { - - - var eventSink: FlutterEventSink?; - var installationIDObserver: NSObjectProtocol?; - var instance:Installations; - var installationsId:String = ""; - - init(instance: Installations) { - self.instance = instance; - } - - @objc func handleInstallationIDChange() { - var events = Dictionary(); - - // Fetch new installation Id - instance.installationID { (newId:String?, error:Error?) in - if error != nil { - self.eventSink!(FlutterError()) - } else { - if(newId != self.installationsId) { - self.installationsId = newId!; - events["token"] = self.installationsId; - self.eventSink!(events) - } - } - } - } - - public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { - eventSink = events - - // [START handle_installation_id_change] - installationIDObserver = NotificationCenter.default.addObserver( - forName: .InstallationIDDidChange, - object: nil, - queue: nil - ) { (notification) in - self.handleInstallationIDChange() - } - // [END handle_installation_id_change] - - return nil - } - - public func onCancel(withArguments arguments: Any?) -> FlutterError? { - self.eventSink = nil - return nil - } - -} diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift b/packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift new file mode 120000 index 000000000000..b9d22007e609 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/Classes/IdChangedStreamHandler.swift @@ -0,0 +1 @@ +../../ios/Classes/IdChangedStreamHandler.swift \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift deleted file mode 100644 index d487c4b8381a..000000000000 --- a/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift +++ /dev/null @@ -1,172 +0,0 @@ -import FlutterMacOS -import firebase_core -import FirebaseInstallations - -let kFLTFirebaseInstallationsChannelName = "plugins.flutter.io/firebase_installations"; - -public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin { - - private var eventSink: FlutterEventSink? - private var messenger:FlutterBinaryMessenger; - - var result:FLTFirebaseMethodCallResult?; - var streamHandler = Dictionary(); - - var args = NSDictionary.init(); - - init(messenger:FlutterBinaryMessenger) { - self.messenger = messenger; - } - - public static func register(with registrar: FlutterPluginRegistrar) { - let channel = FlutterMethodChannel(name: kFLTFirebaseInstallationsChannelName, binaryMessenger: registrar.messenger) - let instance = SwiftFirebaseInstallationsPlugin(messenger: registrar.messenger) - registrar.addMethodCallDelegate(instance, channel: channel) - } - - @objc private func onIdChanged(notification: NSNotification) { - print("changed") - } - - /// Gets Installations instance for a Firebase App. - /// - Returns: a Firebase Installations instance for the passed app from Dart - internal func getInstallations() -> Installations { - let appName = FLTFirebasePlugin.firebaseAppName(fromDartName: (args["appName"] as! String)) - let app:FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(appName)! - return Installations.installations(app: app) - } - - /// Gets Installations Id for an instance. - /// - Parameter arguments: the arguments passed by the Dart calling method - /// - Parameter result: the result instance used to send the result to Dart. - internal func getId() { - let instance:Installations = getInstallations(); - - var installationsId:String = "" - - instance.installationID { (id:String?, error:Error?) in - if error != nil { - self.result!.error(nil, nil, nil, error) - } else { - installationsId = id ?? "" - NSLog("Firebase Installation ID: %@", installationsId) - - self.result!.success(id) - } - - - } - } - - /// Deletes Installations Id for an instance. - internal func deleteId() { - let instance:Installations = getInstallations(); - - instance.delete { (error:Error?) in - if error != nil { - self.result!.error(nil, nil, nil, error) - } else { - NSLog("Firebase Installation ID deleted successfully.") - self.result!.success(nil) - } - } - - } - - /// Gets the token Id for an instance. - internal func getToken() { - let instance:Installations = getInstallations(); - - var installationsAuthToken:String = "" - - let forceRefresh:Bool = (args["forceRefresh"] as? Bool) ?? false; - - instance.authTokenForcingRefresh (forceRefresh, completion: {(tokenResult:InstallationsAuthTokenResult?, error:Error?) in - if error != nil { - self.result!.error(nil, nil, nil, error) - } else { - installationsAuthToken = tokenResult?.authToken ?? "" - - NSLog("Firebase Installation Auth Token: %@", installationsAuthToken) - - self.result!.success(installationsAuthToken) - } - }); - } - - /// Starts listening to Installation ID events for an instance. - internal func registerTokenListener() { - let instance:Installations = getInstallations(); - - let appName = (args["appName"] as! String) - let eventChannelName:String = kFLTFirebaseInstallationsChannelName + "/token/" + appName; - - let eventChannel = FlutterEventChannel(name: eventChannelName, binaryMessenger: messenger) - - if (self.streamHandler[eventChannelName] == nil) { - self.streamHandler[eventChannelName] = IdChangedStreamHandler(instance: instance) - } - - eventChannel.setStreamHandler((self.streamHandler[eventChannelName]!)) - - result?.success(eventChannelName) - } - - - internal func mapInstallationsErrorCodes(code:UInt) -> NSString { - let error = InstallationsErrorCode.init(rawValue: code) ?? InstallationsErrorCode.unknown; - - switch error { - case InstallationsErrorCode.invalidConfiguration: - return "invalid-configuration"; - case InstallationsErrorCode.keychain: - return "invalid-keychain"; - case InstallationsErrorCode.serverUnreachable: - return "server-unreachable"; - case InstallationsErrorCode.unknown: - return "unknown"; - default: - return "unknown"; - } - } - - - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - let args = call.arguments as! NSDictionary - - let errorBlock:FLTFirebaseMethodCallErrorBlock = { (code, message, details, error:Error?) in - var errorDetails:Dictionary = Dictionary(); - - errorDetails["code"] = code ?? self.mapInstallationsErrorCodes(code:UInt((error! as NSError).code)) - errorDetails["message"] = message ?? error?.localizedDescription ?? "An unknown error has occurred."; - errorDetails["additionalData"] = details - - - if(code == "unknown") { - NSLog("FLTFirebaseInstallations: An error occured while calling method %@", call.method) - } - - result(FLTFirebasePlugin.createFlutterError(fromCode: errorDetails["code"] as! String, - message: errorDetails["message"] as! String, - optionalDetails: (errorDetails["additionalData"] as? [AnyHashable : Any]), - andOptionalNSError: error)) - }; - - self.result = .create(success: result, andErrorBlock: errorBlock) - self.args = args - - switch (call.method) { - case "FirebaseInstallations#getId": - getId() - case "FirebaseInstallations#delete": - deleteId() - case "FirebaseInstallations#getToken": - getToken() - case "FirebaseInstallations#registerIdTokenListener": - registerTokenListener() - default: - result(FlutterMethodNotImplemented) - } - - } -} diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift new file mode 120000 index 000000000000..91f5e6574d86 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift @@ -0,0 +1 @@ +../../ios/Classes/SwiftFirebaseInstallationsPlugin.swift \ No newline at end of file From 523a121da6a57abaa4469b32d9ef5abc3ceb4294 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 17:08:58 +0300 Subject: [PATCH 30/51] chore: fix format and analyze --- .../ios/Classes/FLTFirebaseAuthPlugin.m | 74 +++++++++---------- .../TokenChannelStreamHandler.java | 1 - .../test/firebase_installations_test.dart | 14 ++-- 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/packages/firebase_auth/firebase_auth/ios/Classes/FLTFirebaseAuthPlugin.m b/packages/firebase_auth/firebase_auth/ios/Classes/FLTFirebaseAuthPlugin.m index b777494fb2b5..e5a23055995b 100644 --- a/packages/firebase_auth/firebase_auth/ios/Classes/FLTFirebaseAuthPlugin.m +++ b/packages/firebase_auth/firebase_auth/ios/Classes/FLTFirebaseAuthPlugin.m @@ -727,29 +727,29 @@ - (void)userUnlink:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallResu } [currentUser - unlinkFromProvider:arguments[kArgumentProviderId] - completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { - if (error != nil) { - result.error(nil, nil, nil, error); - } else { - [auth.currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { - if (reloadError != nil) { - result.error(nil, nil, nil, reloadError); - } else { - // Note: On other SDKs `unlinkFromProvider` returns an AuthResult - // instance, whereas the iOS SDK currently does not, so we manualy - // construct a Dart representation of one here. - result.success(@{ - @"additionalUserInfo" : [NSNull null], - @"authCredential" : [NSNull null], - @"user" : auth.currentUser - ? [FLTFirebaseAuthPlugin getNSDictionaryFromUser:auth.currentUser] - : [NSNull null], - }); - } - }]; - } - }]; + unlinkFromProvider:arguments[kArgumentProviderId] + completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { + if (error != nil) { + result.error(nil, nil, nil, error); + } else { + [auth.currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + result.error(nil, nil, nil, reloadError); + } else { + // Note: On other SDKs `unlinkFromProvider` returns an AuthResult + // instance, whereas the iOS SDK currently does not, so we manualy + // construct a Dart representation of one here. + result.success(@{ + @"additionalUserInfo" : [NSNull null], + @"authCredential" : [NSNull null], + @"user" : auth.currentUser + ? [FLTFirebaseAuthPlugin getNSDictionaryFromUser:auth.currentUser] + : [NSNull null], + }); + } + }]; + } + }]; } - (void)userUpdateEmail:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallResult *)result { @@ -819,20 +819,20 @@ - (void)userUpdatePhoneNumber:(id)arguments } [currentUser - updatePhoneNumberCredential:(FIRPhoneAuthCredential *)credential - completion:^(NSError *_Nullable error) { - if (error != nil) { - result.error(nil, nil, nil, error); - } else { - [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { - if (reloadError != nil) { - result.error(nil, nil, nil, reloadError); - } else { - result.success(auth.currentUser); - } - }]; - } - }]; + updatePhoneNumberCredential:(FIRPhoneAuthCredential *)credential + completion:^(NSError *_Nullable error) { + if (error != nil) { + result.error(nil, nil, nil, error); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + result.error(nil, nil, nil, reloadError); + } else { + result.success(auth.currentUser); + } + }]; + } + }]; #else NSLog(@"Updating a users phone number via Firebase Authentication is only supported on the iOS " @"platform."); diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java index 39a55dba7c84..255a16e1dd10 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java @@ -1,6 +1,5 @@ package io.flutter.plugins.firebase.installations.firebase_installations; - import com.google.firebase.installations.FirebaseInstallations; import com.google.firebase.installations.internal.FidListener; import io.flutter.plugin.common.EventChannel; diff --git a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart index c05b2928e33a..2fa78fa0046a 100644 --- a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart +++ b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart @@ -1,4 +1,3 @@ -// ignore_for_file: require_trailing_commas // 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. @@ -24,9 +23,13 @@ void main() { setUpAll(() async { await Firebase.initializeApp(); installations = FirebaseInstallations.instance; - when(mockInstallations.delegateFor( - app: anyNamed('app'), - )).thenAnswer((_) => mockInstallations); + when( + mockInstallations.delegateFor( + app: anyNamed('app'), + ), + ).thenAnswer( + (_) => mockInstallations, + ); when(mockInstallations.getId()).thenAnswer( (_) => Future.value('some-id'), ); @@ -38,7 +41,7 @@ void main() { }); test('getAuthToken', () async { await installations.getToken(); - verify(mockInstallations.getToken(false)); + verify(mockInstallations.getToken()); }); test('delete', () async { await installations.delete(); @@ -107,6 +110,7 @@ class MockFirebaseInstallations extends Mock } @override + // ignore: type_annotate_public_apis Future getToken([forceRefresh = false]) { return super.noSuchMethod( Invocation.method(#getToken, [forceRefresh]), From baa121d4523f689a705779782bac55e36eceff0b Mon Sep 17 00:00:00 2001 From: Mais Alheraki Date: Fri, 3 Dec 2021 17:15:55 +0300 Subject: [PATCH 31/51] chore: typo Co-authored-by: Mike Diarmid --- .../firebase_installations/ios/firebase_installations.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec b/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec index c8dc7fb9f405..cb12a57ecba5 100644 --- a/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec +++ b/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec @@ -40,7 +40,7 @@ A new flutter plugin project. s.static_framework = true s.pod_target_xcconfig = { - 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\@\\\"#{library_version}\\\" LIBRARY_NAME=\\@\\\"flutter-fire-rtdb\\\"", + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\@\\\"#{library_version}\\\" LIBRARY_NAME=\\@\\\"flutter-fire-installations\\\"", 'DEFINES_MODULE' => 'YES' } end From 2a1fda8bc7f5e211447bf02d25c2794d28a8f25e Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 18:25:44 +0300 Subject: [PATCH 32/51] chore: macos platform version --- .../firebase_installations/macos/firebase_installations.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec b/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec index 0cab683fe6ff..2e1412899364 100644 --- a/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec +++ b/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec @@ -49,7 +49,7 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/*.h' - s.platform = :osx, '10.12' + s.platform = :osx, '10.11' s.swift_version = '5.5' From ac8659305ae066f206772ef932ac2362b9615dfe Mon Sep 17 00:00:00 2001 From: Mais Alheraki Date: Fri, 3 Dec 2021 18:32:09 +0300 Subject: [PATCH 33/51] chore: typo Co-authored-by: Mike Diarmid --- .../firebase_installations/macos/firebase_installations.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec b/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec index 2e1412899364..20de31aac8b2 100644 --- a/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec +++ b/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec @@ -62,7 +62,7 @@ A new flutter plugin project. s.static_framework = true s.pod_target_xcconfig = { - 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\@\\\"#{library_version}\\\" LIBRARY_NAME=\\@\\\"flutter-fire-rtdb\\\"", + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\@\\\"#{library_version}\\\" LIBRARY_NAME=\\@\\\"flutter-fire-installations\\\"", 'DEFINES_MODULE' => 'YES' } end From 54f9fbad7fe55f688e8b38aa3914e9e2ac91b847 Mon Sep 17 00:00:00 2001 From: Mais Alheraki Date: Fri, 3 Dec 2021 18:32:41 +0300 Subject: [PATCH 34/51] chore: changelog Co-authored-by: Mike Diarmid --- .../firebase_installations_web/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firebase_installations/firebase_installations_web/CHANGELOG.md b/packages/firebase_installations/firebase_installations_web/CHANGELOG.md index 41cc7d8192ec..8992730a2603 100644 --- a/packages/firebase_installations/firebase_installations_web/CHANGELOG.md +++ b/packages/firebase_installations/firebase_installations_web/CHANGELOG.md @@ -1,3 +1,3 @@ ## 0.0.1 -* TODO: Describe initial release. + - Initial release of the Firebase Installations plugin. From 14abb72a96d4e44f831e93c60b44d762efdebc8f Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Fri, 3 Dec 2021 18:47:31 +0300 Subject: [PATCH 35/51] chore: license --- .../firebase_installations/LICENSE | 28 ++++++++++++++++++- .../FirebaseInstallationsPlugin.java | 4 +++ .../TokenChannelStreamHandler.java | 4 +++ .../ios/Classes/FirebaseInstallationsPlugin.h | 4 +++ .../ios/Classes/FirebaseInstallationsPlugin.m | 4 +++ .../ios/Classes/IdChangedStreamHandler.swift | 6 +++- .../SwiftFirebaseInstallationsPlugin.swift | 4 +++ .../LICENSE | 28 ++++++++++++++++++- .../firebase_installations_web/LICENSE | 28 ++++++++++++++++++- 9 files changed, 106 insertions(+), 4 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/LICENSE b/packages/firebase_installations/firebase_installations/LICENSE index ba75c69f7f21..5b8717b87644 100644 --- a/packages/firebase_installations/firebase_installations/LICENSE +++ b/packages/firebase_installations/firebase_installations/LICENSE @@ -1 +1,27 @@ -TODO: Add your license here. +// Copyright 2021 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java index 0b237acfae4b..492405f65a4d 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java @@ -1,3 +1,7 @@ +// 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.installations.firebase_installations; import androidx.annotation.NonNull; diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java index 255a16e1dd10..690e6347c01f 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java @@ -1,3 +1,7 @@ +// 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.installations.firebase_installations; import com.google.firebase.installations.FirebaseInstallations; diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h index 57c623a35516..a907f47bee53 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h @@ -1,3 +1,7 @@ +// 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. + #import #if TARGET_OS_OSX diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m index 2e10e8ea08ad..94b5ab3c3631 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m @@ -1,3 +1,7 @@ +// 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. + #import "FirebaseInstallationsPlugin.h" #if __has_include() #import diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift index 468595c8ad79..f5f84c8f4c55 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift +++ b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift @@ -1,4 +1,8 @@ -import Foundation +// 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.i + +mport Foundation import FirebaseInstallations class IdChangedStreamHandler: NSObject, FlutterStreamHandler { diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift index aca91e9574fa..c0c38b6ed6e9 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift +++ b/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift @@ -1,3 +1,7 @@ +// 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. + #if canImport(FlutterMacOS) import FlutterMacOS #else diff --git a/packages/firebase_installations/firebase_installations_platform_interface/LICENSE b/packages/firebase_installations/firebase_installations_platform_interface/LICENSE index ba75c69f7f21..5b8717b87644 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/LICENSE +++ b/packages/firebase_installations/firebase_installations_platform_interface/LICENSE @@ -1 +1,27 @@ -TODO: Add your license here. +// Copyright 2021 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations_web/LICENSE b/packages/firebase_installations/firebase_installations_web/LICENSE index ba75c69f7f21..5b8717b87644 100644 --- a/packages/firebase_installations/firebase_installations_web/LICENSE +++ b/packages/firebase_installations/firebase_installations_web/LICENSE @@ -1 +1,27 @@ -TODO: Add your license here. +// Copyright 2021 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file From e84ab302180a8d3360e9dcbec83b7ec9c7df2f59 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 12:27:51 +0300 Subject: [PATCH 36/51] chore: typo --- .../ios/Classes/IdChangedStreamHandler.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift index f5f84c8f4c55..052ba630498c 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift +++ b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift @@ -1,8 +1,8 @@ // 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.i +// found in the LICENSE file. -mport Foundation +import Foundation import FirebaseInstallations class IdChangedStreamHandler: NSObject, FlutterStreamHandler { From 5c785fd98580303268f6bae12204ac37cd6a545d Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 12:45:04 +0300 Subject: [PATCH 37/51] chore: commit macos podfile --- .../example/macos/Podfile | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 packages/firebase_installations/firebase_installations/example/macos/Podfile diff --git a/packages/firebase_installations/firebase_installations/example/macos/Podfile b/packages/firebase_installations/firebase_installations/example/macos/Podfile new file mode 100644 index 000000000000..22d9caad2e9d --- /dev/null +++ b/packages/firebase_installations/firebase_installations/example/macos/Podfile @@ -0,0 +1,40 @@ +platform :osx, '10.12' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end From a457f81e62b59c89a0e1040cd30be15e6d865bad Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 13:51:01 +0300 Subject: [PATCH 38/51] chore: update README --- .../firebase_installations/README.md | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/README.md b/packages/firebase_installations/firebase_installations/README.md index 0b4a9a7ffdfe..82997b0d8659 100644 --- a/packages/firebase_installations/firebase_installations/README.md +++ b/packages/firebase_installations/firebase_installations/README.md @@ -1,15 +1,23 @@ -# firebase_installations +# Firebase Installations Plugin for Flutter -A new flutter plugin project. +A Flutter plugin to use the [Firebase Installations API](https://firebase.google.com/docs/projects/manage-installations). + +[![pub package](https://img.shields.io/pub/v/firebase_installations.svg)](https://pub.dev/packages/firebase_installations) ## Getting Started -This project is a starting point for a Flutter -[plug-in package](https://flutter.dev/developing-packages/), -a specialized package that includes platform-specific implementation code for -Android and/or iOS. +To get started with Firebase Installations for Flutter, please [see the documentation](https://firebase.flutter.dev/docs/installations/overview). + +## Usage + +To use this plugin, please visit the [Installations Usage documentation](https://firebase.flutter.dev/docs/installations/usage) + +## Issues and feedback + +Please file FlutterFire specific issues, bugs, or feature requests in our [issue tracker](https://github.com/FirebaseExtended/flutterfire/issues/new). -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +Plugin issues that are not specific to FlutterFire can be filed in the [Flutter issue tracker](https://github.com/flutter/flutter/issues/new). +To contribute a change to this plugin, +please review our [contribution guide](https://github.com/FirebaseExtended/flutterfire/blob/master/CONTRIBUTING.md) +and open a [pull request](https://github.com/FirebaseExtended/flutterfire/pulls). From f6a31f9eb0f7397c407cad8286c2a3bb3967deae Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 14:17:00 +0300 Subject: [PATCH 39/51] chore: exaample app enhancment --- .../firebase_installations/example/lib/main.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart index bf27584d35f0..dff97dd93b46 100644 --- a/packages/firebase_installations/firebase_installations/example/lib/main.dart +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -42,8 +42,7 @@ class _InstallationsCardState extends State { @override void initState() { super.initState(); - getAuthToken(); - getId(); + init(); // Listen to changes FirebaseInstallations.instance.idTokenChanges.listen((event) { @@ -66,6 +65,11 @@ class _InstallationsCardState extends State { String id = 'None'; String authToken = 'None'; + init() async { + await getId(); + await getAuthToken(); + } + Future deleteId() async { try { await FirebaseInstallations.instance.delete(); From befb6b26d821ba27ed0579a28c5a5748160a3786 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 15:29:49 +0300 Subject: [PATCH 40/51] Revert "chore: fix format and analyze" This reverts commit 523a121da6a57abaa4469b32d9ef5abc3ceb4294. --- .../ios/Classes/FLTFirebaseAuthPlugin.m | 74 +++++++++---------- .../TokenChannelStreamHandler.java | 1 + .../test/firebase_installations_test.dart | 14 ++-- 3 files changed, 43 insertions(+), 46 deletions(-) diff --git a/packages/firebase_auth/firebase_auth/ios/Classes/FLTFirebaseAuthPlugin.m b/packages/firebase_auth/firebase_auth/ios/Classes/FLTFirebaseAuthPlugin.m index e5a23055995b..b777494fb2b5 100644 --- a/packages/firebase_auth/firebase_auth/ios/Classes/FLTFirebaseAuthPlugin.m +++ b/packages/firebase_auth/firebase_auth/ios/Classes/FLTFirebaseAuthPlugin.m @@ -727,29 +727,29 @@ - (void)userUnlink:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallResu } [currentUser - unlinkFromProvider:arguments[kArgumentProviderId] - completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { - if (error != nil) { - result.error(nil, nil, nil, error); - } else { - [auth.currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { - if (reloadError != nil) { - result.error(nil, nil, nil, reloadError); - } else { - // Note: On other SDKs `unlinkFromProvider` returns an AuthResult - // instance, whereas the iOS SDK currently does not, so we manualy - // construct a Dart representation of one here. - result.success(@{ - @"additionalUserInfo" : [NSNull null], - @"authCredential" : [NSNull null], - @"user" : auth.currentUser - ? [FLTFirebaseAuthPlugin getNSDictionaryFromUser:auth.currentUser] - : [NSNull null], - }); - } - }]; - } - }]; + unlinkFromProvider:arguments[kArgumentProviderId] + completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { + if (error != nil) { + result.error(nil, nil, nil, error); + } else { + [auth.currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + result.error(nil, nil, nil, reloadError); + } else { + // Note: On other SDKs `unlinkFromProvider` returns an AuthResult + // instance, whereas the iOS SDK currently does not, so we manualy + // construct a Dart representation of one here. + result.success(@{ + @"additionalUserInfo" : [NSNull null], + @"authCredential" : [NSNull null], + @"user" : auth.currentUser + ? [FLTFirebaseAuthPlugin getNSDictionaryFromUser:auth.currentUser] + : [NSNull null], + }); + } + }]; + } + }]; } - (void)userUpdateEmail:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallResult *)result { @@ -819,20 +819,20 @@ - (void)userUpdatePhoneNumber:(id)arguments } [currentUser - updatePhoneNumberCredential:(FIRPhoneAuthCredential *)credential - completion:^(NSError *_Nullable error) { - if (error != nil) { - result.error(nil, nil, nil, error); - } else { - [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { - if (reloadError != nil) { - result.error(nil, nil, nil, reloadError); - } else { - result.success(auth.currentUser); - } - }]; - } - }]; + updatePhoneNumberCredential:(FIRPhoneAuthCredential *)credential + completion:^(NSError *_Nullable error) { + if (error != nil) { + result.error(nil, nil, nil, error); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + result.error(nil, nil, nil, reloadError); + } else { + result.success(auth.currentUser); + } + }]; + } + }]; #else NSLog(@"Updating a users phone number via Firebase Authentication is only supported on the iOS " @"platform."); diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java index 690e6347c01f..fb4787c5fdc7 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java @@ -4,6 +4,7 @@ package io.flutter.plugins.firebase.installations.firebase_installations; + import com.google.firebase.installations.FirebaseInstallations; import com.google.firebase.installations.internal.FidListener; import io.flutter.plugin.common.EventChannel; diff --git a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart index 2fa78fa0046a..c05b2928e33a 100644 --- a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart +++ b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart @@ -1,3 +1,4 @@ +// ignore_for_file: require_trailing_commas // 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. @@ -23,13 +24,9 @@ void main() { setUpAll(() async { await Firebase.initializeApp(); installations = FirebaseInstallations.instance; - when( - mockInstallations.delegateFor( - app: anyNamed('app'), - ), - ).thenAnswer( - (_) => mockInstallations, - ); + when(mockInstallations.delegateFor( + app: anyNamed('app'), + )).thenAnswer((_) => mockInstallations); when(mockInstallations.getId()).thenAnswer( (_) => Future.value('some-id'), ); @@ -41,7 +38,7 @@ void main() { }); test('getAuthToken', () async { await installations.getToken(); - verify(mockInstallations.getToken()); + verify(mockInstallations.getToken(false)); }); test('delete', () async { await installations.delete(); @@ -110,7 +107,6 @@ class MockFirebaseInstallations extends Mock } @override - // ignore: type_annotate_public_apis Future getToken([forceRefresh = false]) { return super.noSuchMethod( Invocation.method(#getToken, [forceRefresh]), From 37718c90270a27bbcf3c4bc45272a99bb1720949 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 15:38:38 +0300 Subject: [PATCH 41/51] Revert "chore: run format" This reverts commit 2474cf79062a4dbe9cb120de9c3b3c16e9864b5e. --- .../analysis_options.yaml | 4 + .../FirebaseInstallationsPlugin.java | 90 ++++++++++--------- .../FlutterFirebaseAppRegistrar.java | 3 +- .../TokenChannelStreamHandler.java | 9 +- .../ios/Classes/FirebaseInstallationsPlugin.h | 2 +- .../ios/Classes/FirebaseInstallationsPlugin.m | 21 ++--- .../ios/Classes/FLTFirebaseMessagingPlugin.m | 2 +- 7 files changed, 75 insertions(+), 56 deletions(-) create mode 100644 packages/firebase_installations/firebase_installations/analysis_options.yaml diff --git a/packages/firebase_installations/firebase_installations/analysis_options.yaml b/packages/firebase_installations/firebase_installations/analysis_options.yaml new file mode 100644 index 000000000000..a5744c1cfbe7 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java index 492405f65a4d..43860bdc19ad 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java @@ -4,13 +4,20 @@ package io.flutter.plugins.firebase.installations.firebase_installations; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; import com.google.firebase.installations.FirebaseInstallations; import com.google.firebase.installations.InstallationTokenResult; +import com.google.firebase.installations.internal.FidListener; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.EventChannel; @@ -20,26 +27,27 @@ import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugins.firebase.core.FlutterFirebasePlugin; import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -/** FirebaseInstallationsPlugin */ -public class FirebaseInstallationsPlugin - implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler { +/** + * FirebaseInstallationsPlugin + */ +public class FirebaseInstallationsPlugin implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler { private MethodChannel channel; private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_installations"; private final Map streamHandlers = new HashMap<>(); - @Nullable private BinaryMessenger messenger; + @Nullable + private BinaryMessenger messenger; private MethodChannel setup(BinaryMessenger binaryMessenger) { - final MethodChannel channel = new MethodChannel(binaryMessenger, METHOD_CHANNEL_NAME); + final MethodChannel channel = + new MethodChannel(binaryMessenger, METHOD_CHANNEL_NAME); channel.setMethodCallHandler(this); this.messenger = binaryMessenger; return channel; } + @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { BinaryMessenger binaryMessenger = flutterPluginBinding.getBinaryMessenger(); @@ -55,6 +63,7 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { messenger = null; removeEventListeners(); + } private FirebaseInstallations getInstallations(Map arguments) { @@ -69,32 +78,31 @@ private Task getId(Map arguments) { private Task getToken(Map arguments) { return Tasks.call( - cachedThreadPool, - () -> { - FirebaseInstallations firebaseInstallations = getInstallations(arguments); - Boolean forceRefresh = (Boolean) Objects.requireNonNull(arguments.get("forceRefresh")); - InstallationTokenResult tokenResult = - Tasks.await(firebaseInstallations.getToken(forceRefresh)); - return tokenResult.getToken(); - }); + cachedThreadPool, + () -> { + FirebaseInstallations firebaseInstallations = getInstallations(arguments); + Boolean forceRefresh = (Boolean) Objects.requireNonNull(arguments.get("forceRefresh")); + InstallationTokenResult tokenResult = Tasks.await(firebaseInstallations.getToken(forceRefresh)); + return tokenResult.getToken(); + }); } private Task registerTokenListener(Map arguments) { return Tasks.call( - cachedThreadPool, - () -> { - String appName = (String) Objects.requireNonNull(arguments.get("appName")); - FirebaseInstallations firebaseInstallations = getInstallations(arguments); + cachedThreadPool, + () -> { + String appName = (String) Objects.requireNonNull(arguments.get("appName")); + FirebaseInstallations firebaseInstallations = getInstallations(arguments); - TokenChannelStreamHandler handler = new TokenChannelStreamHandler(firebaseInstallations); + TokenChannelStreamHandler handler = new TokenChannelStreamHandler(firebaseInstallations); - final String name = METHOD_CHANNEL_NAME + "/token/" + appName; - final EventChannel channel = new EventChannel(messenger, name); - channel.setStreamHandler(handler); - streamHandlers.put(channel, handler); + final String name = METHOD_CHANNEL_NAME + "/token/" + appName; + final EventChannel channel = new EventChannel(messenger, name); + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); - return name; - }); + return name; + }); } private Task deleteId(Map arguments) { @@ -122,20 +130,21 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { default: result.notImplemented(); return; + } methodCallTask.addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - result.success(task.getResult()); - } else { - Exception exception = task.getException(); - result.error( - "firebase_installations", - exception != null ? exception.getMessage() : null, - getExceptionDetails(exception)); - } - }); + task -> { + if (task.isSuccessful()) { + result.success(task.getResult()); + } else { + Exception exception = task.getException(); + result.error( + "firebase_installations", + exception != null ? exception.getMessage() : null, + getExceptionDetails(exception)); + } + }); } private Map getExceptionDetails(@Nullable Exception exception) { @@ -149,6 +158,7 @@ private Map getExceptionDetails(@Nullable Exception exception) { return details; } + @Override public Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { return Tasks.call(cachedThreadPool, () -> null); diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java index ff8becf25d7b..4eef816fabb2 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java @@ -3,7 +3,6 @@ // found in the LICENSE file. package io.flutter.plugins.firebase.installations.firebase_installations; - import androidx.annotation.Keep; import com.google.firebase.components.Component; import com.google.firebase.components.ComponentRegistrar; @@ -16,6 +15,6 @@ public class FlutterFirebaseAppRegistrar implements ComponentRegistrar { @Override public List> getComponents() { return Collections.>singletonList( - LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); + LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); } } diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java index fb4787c5fdc7..5a8c074b4f03 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java @@ -4,13 +4,17 @@ package io.flutter.plugins.firebase.installations.firebase_installations; +import androidx.annotation.NonNull; import com.google.firebase.installations.FirebaseInstallations; import com.google.firebase.installations.internal.FidListener; -import io.flutter.plugin.common.EventChannel; + import java.util.HashMap; import java.util.Map; +import io.flutter.Log; +import io.flutter.plugin.common.EventChannel; + public class TokenChannelStreamHandler implements EventChannel.StreamHandler { private final FirebaseInstallations firebaseInstallations; @@ -25,6 +29,7 @@ public void onListen(Object arguments, EventChannel.EventSink events) { listener = createTokenEventListener(events); + firebaseInstallations.registerFidListener(listener); } @@ -39,7 +44,7 @@ FidListener createTokenEventListener(final EventChannel.EventSink events) { return token -> { Map event = new HashMap<>(); - event.put("token", token); + event.put("token" , token); events.success(event); }; diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h index a907f47bee53..aabadf982ab3 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h @@ -12,5 +12,5 @@ #import -@interface FirebaseInstallationsPlugin : FLTFirebasePlugin +@interface FirebaseInstallationsPlugin : FLTFirebasePlugin @end diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m index 94b5ab3c3631..c20fde84365b 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m @@ -17,24 +17,25 @@ + (void)registerWithRegistrar:(NSObject*)registrar { [SwiftFirebaseInstallationsPlugin registerWithRegistrar:registrar]; } -- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { - completion(); +- (void)didReinitializeFirebaseCore:(void (^ _Nonnull)(void))completion { + completion(); } -- (NSString* _Nonnull)firebaseLibraryName { - return LIBRARY_NAME; +- (NSString * _Nonnull)firebaseLibraryName { + return LIBRARY_NAME; } -- (NSString* _Nonnull)firebaseLibraryVersion { - return LIBRARY_VERSION; +- (NSString * _Nonnull)firebaseLibraryVersion { + return LIBRARY_VERSION; } -- (NSString* _Nonnull)flutterChannelName { - return @"plugins.flutter.io/firebase_installations"; +- (NSString * _Nonnull)flutterChannelName { + return @"plugins.flutter.io/firebase_installations"; } -- (NSDictionary* _Nonnull)pluginConstantsForFIRApp:(FIRApp* _Nonnull)firebaseApp { - return @{}; +- (NSDictionary * _Nonnull)pluginConstantsForFIRApp:(FIRApp * _Nonnull)firebaseApp { + return @{}; } @end + diff --git a/packages/firebase_messaging/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m b/packages/firebase_messaging/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m index 3523a83948ca..8ee1dcb2089f 100644 --- a/packages/firebase_messaging/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m +++ b/packages/firebase_messaging/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m @@ -180,7 +180,7 @@ - (void)messaging:(nonnull FIRMessaging *)messaging if ([[GULAppDelegateSwizzler sharedApplication].delegate respondsToSelector:messaging_didReceiveRegistrationTokenSelector]) { void (*usersDidReceiveRegistrationTokenIMP)(id, SEL, FIRMessaging *, NSString *) = - (typeof(usersDidReceiveRegistrationTokenIMP))&objc_msgSend; + (typeof(usersDidReceiveRegistrationTokenIMP)) & objc_msgSend; usersDidReceiveRegistrationTokenIMP([GULAppDelegateSwizzler sharedApplication].delegate, messaging_didReceiveRegistrationTokenSelector, messaging, fcmToken); From 9fedcf212bc812563056b2b5efd5baed362558c6 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 16:00:18 +0300 Subject: [PATCH 42/51] chore: format --- .../analysis_options.yaml | 4 - .../FirebaseInstallationsPlugin.java | 90 +++++++++---------- .../FlutterFirebaseAppRegistrar.java | 3 +- .../TokenChannelStreamHandler.java | 10 +-- .../ios/Classes/FirebaseInstallationsPlugin.h | 2 +- .../ios/Classes/FirebaseInstallationsPlugin.m | 21 +++-- .../test/firebase_installations_test.dart | 3 +- 7 files changed, 57 insertions(+), 76 deletions(-) delete mode 100644 packages/firebase_installations/firebase_installations/analysis_options.yaml diff --git a/packages/firebase_installations/firebase_installations/analysis_options.yaml b/packages/firebase_installations/firebase_installations/analysis_options.yaml deleted file mode 100644 index a5744c1cfbe7..000000000000 --- a/packages/firebase_installations/firebase_installations/analysis_options.yaml +++ /dev/null @@ -1,4 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java index 43860bdc19ad..492405f65a4d 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java @@ -4,20 +4,13 @@ package io.flutter.plugins.firebase.installations.firebase_installations; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; import com.google.firebase.installations.FirebaseInstallations; import com.google.firebase.installations.InstallationTokenResult; -import com.google.firebase.installations.internal.FidListener; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.EventChannel; @@ -27,27 +20,26 @@ import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugins.firebase.core.FlutterFirebasePlugin; import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; -/** - * FirebaseInstallationsPlugin - */ -public class FirebaseInstallationsPlugin implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler { +/** FirebaseInstallationsPlugin */ +public class FirebaseInstallationsPlugin + implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler { private MethodChannel channel; private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_installations"; private final Map streamHandlers = new HashMap<>(); - @Nullable - private BinaryMessenger messenger; + @Nullable private BinaryMessenger messenger; private MethodChannel setup(BinaryMessenger binaryMessenger) { - final MethodChannel channel = - new MethodChannel(binaryMessenger, METHOD_CHANNEL_NAME); + final MethodChannel channel = new MethodChannel(binaryMessenger, METHOD_CHANNEL_NAME); channel.setMethodCallHandler(this); this.messenger = binaryMessenger; return channel; } - @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { BinaryMessenger binaryMessenger = flutterPluginBinding.getBinaryMessenger(); @@ -63,7 +55,6 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { messenger = null; removeEventListeners(); - } private FirebaseInstallations getInstallations(Map arguments) { @@ -78,31 +69,32 @@ private Task getId(Map arguments) { private Task getToken(Map arguments) { return Tasks.call( - cachedThreadPool, - () -> { - FirebaseInstallations firebaseInstallations = getInstallations(arguments); - Boolean forceRefresh = (Boolean) Objects.requireNonNull(arguments.get("forceRefresh")); - InstallationTokenResult tokenResult = Tasks.await(firebaseInstallations.getToken(forceRefresh)); - return tokenResult.getToken(); - }); + cachedThreadPool, + () -> { + FirebaseInstallations firebaseInstallations = getInstallations(arguments); + Boolean forceRefresh = (Boolean) Objects.requireNonNull(arguments.get("forceRefresh")); + InstallationTokenResult tokenResult = + Tasks.await(firebaseInstallations.getToken(forceRefresh)); + return tokenResult.getToken(); + }); } private Task registerTokenListener(Map arguments) { return Tasks.call( - cachedThreadPool, - () -> { - String appName = (String) Objects.requireNonNull(arguments.get("appName")); - FirebaseInstallations firebaseInstallations = getInstallations(arguments); + cachedThreadPool, + () -> { + String appName = (String) Objects.requireNonNull(arguments.get("appName")); + FirebaseInstallations firebaseInstallations = getInstallations(arguments); - TokenChannelStreamHandler handler = new TokenChannelStreamHandler(firebaseInstallations); + TokenChannelStreamHandler handler = new TokenChannelStreamHandler(firebaseInstallations); - final String name = METHOD_CHANNEL_NAME + "/token/" + appName; - final EventChannel channel = new EventChannel(messenger, name); - channel.setStreamHandler(handler); - streamHandlers.put(channel, handler); + final String name = METHOD_CHANNEL_NAME + "/token/" + appName; + final EventChannel channel = new EventChannel(messenger, name); + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); - return name; - }); + return name; + }); } private Task deleteId(Map arguments) { @@ -130,21 +122,20 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { default: result.notImplemented(); return; - } methodCallTask.addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - result.success(task.getResult()); - } else { - Exception exception = task.getException(); - result.error( - "firebase_installations", - exception != null ? exception.getMessage() : null, - getExceptionDetails(exception)); - } - }); + task -> { + if (task.isSuccessful()) { + result.success(task.getResult()); + } else { + Exception exception = task.getException(); + result.error( + "firebase_installations", + exception != null ? exception.getMessage() : null, + getExceptionDetails(exception)); + } + }); } private Map getExceptionDetails(@Nullable Exception exception) { @@ -158,7 +149,6 @@ private Map getExceptionDetails(@Nullable Exception exception) { return details; } - @Override public Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { return Tasks.call(cachedThreadPool, () -> null); diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java index 4eef816fabb2..ff8becf25d7b 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FlutterFirebaseAppRegistrar.java @@ -3,6 +3,7 @@ // found in the LICENSE file. package io.flutter.plugins.firebase.installations.firebase_installations; + import androidx.annotation.Keep; import com.google.firebase.components.Component; import com.google.firebase.components.ComponentRegistrar; @@ -15,6 +16,6 @@ public class FlutterFirebaseAppRegistrar implements ComponentRegistrar { @Override public List> getComponents() { return Collections.>singletonList( - LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); + LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); } } diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java index 5a8c074b4f03..690e6347c01f 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/TokenChannelStreamHandler.java @@ -4,17 +4,12 @@ package io.flutter.plugins.firebase.installations.firebase_installations; -import androidx.annotation.NonNull; - import com.google.firebase.installations.FirebaseInstallations; import com.google.firebase.installations.internal.FidListener; - +import io.flutter.plugin.common.EventChannel; import java.util.HashMap; import java.util.Map; -import io.flutter.Log; -import io.flutter.plugin.common.EventChannel; - public class TokenChannelStreamHandler implements EventChannel.StreamHandler { private final FirebaseInstallations firebaseInstallations; @@ -29,7 +24,6 @@ public void onListen(Object arguments, EventChannel.EventSink events) { listener = createTokenEventListener(events); - firebaseInstallations.registerFidListener(listener); } @@ -44,7 +38,7 @@ FidListener createTokenEventListener(final EventChannel.EventSink events) { return token -> { Map event = new HashMap<>(); - event.put("token" , token); + event.put("token", token); events.success(event); }; diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h index aabadf982ab3..a907f47bee53 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.h @@ -12,5 +12,5 @@ #import -@interface FirebaseInstallationsPlugin : FLTFirebasePlugin +@interface FirebaseInstallationsPlugin : FLTFirebasePlugin @end diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m index c20fde84365b..94b5ab3c3631 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m @@ -17,25 +17,24 @@ + (void)registerWithRegistrar:(NSObject*)registrar { [SwiftFirebaseInstallationsPlugin registerWithRegistrar:registrar]; } -- (void)didReinitializeFirebaseCore:(void (^ _Nonnull)(void))completion { - completion(); +- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { + completion(); } -- (NSString * _Nonnull)firebaseLibraryName { - return LIBRARY_NAME; +- (NSString* _Nonnull)firebaseLibraryName { + return LIBRARY_NAME; } -- (NSString * _Nonnull)firebaseLibraryVersion { - return LIBRARY_VERSION; +- (NSString* _Nonnull)firebaseLibraryVersion { + return LIBRARY_VERSION; } -- (NSString * _Nonnull)flutterChannelName { - return @"plugins.flutter.io/firebase_installations"; +- (NSString* _Nonnull)flutterChannelName { + return @"plugins.flutter.io/firebase_installations"; } -- (NSDictionary * _Nonnull)pluginConstantsForFIRApp:(FIRApp * _Nonnull)firebaseApp { - return @{}; +- (NSDictionary* _Nonnull)pluginConstantsForFIRApp:(FIRApp* _Nonnull)firebaseApp { + return @{}; } @end - diff --git a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart index c05b2928e33a..3eaaa5da8673 100644 --- a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart +++ b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart @@ -38,7 +38,7 @@ void main() { }); test('getAuthToken', () async { await installations.getToken(); - verify(mockInstallations.getToken(false)); + verify(mockInstallations.getToken()); }); test('delete', () async { await installations.delete(); @@ -107,6 +107,7 @@ class MockFirebaseInstallations extends Mock } @override + // ignore: type_annotate_public_apis Future getToken([forceRefresh = false]) { return super.noSuchMethod( Invocation.method(#getToken, [forceRefresh]), From 24d6f56a084f4e68b4da55e5c4454d02842cc9c2 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 16:55:02 +0300 Subject: [PATCH 43/51] chore(installations): rename platform interface file --- .../lib/firebase_installations_platform_interface.dart | 2 +- ...ions.dart => firebase_installations_platform_interface.dart} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/{platform_interface_firebase_installations.dart => firebase_installations_platform_interface.dart} (100%) diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart index dda2dd2df660..2e753ccbb432 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/firebase_installations_platform_interface.dart @@ -4,4 +4,4 @@ library firebase_installations_platform_interface; -export 'src/platform_interface/platform_interface_firebase_installations.dart'; +export 'src/platform_interface/firebase_installations_platform_interface.dart'; diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/platform_interface_firebase_installations.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart similarity index 100% rename from packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/platform_interface_firebase_installations.dart rename to packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart From f347ab3d3463d0eac44ef923a63f615f91e2f646 Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 16:57:56 +0300 Subject: [PATCH 44/51] docs: updating platfrom interface & web READMEs --- .../README.md | 49 +++++++------------ .../firebase_installations_web/README.md | 41 +++------------- 2 files changed, 25 insertions(+), 65 deletions(-) diff --git a/packages/firebase_installations/firebase_installations_platform_interface/README.md b/packages/firebase_installations/firebase_installations_platform_interface/README.md index 8b55e735b501..3aff0262f878 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/README.md +++ b/packages/firebase_installations/firebase_installations_platform_interface/README.md @@ -1,39 +1,26 @@ - - -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. - -## Features - -TODO: List what your package can do. Maybe include images, gifs, or videos. - -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. +This interface allows platform-specific implementations of the `cloud_firestore` +plugin, as well as the plugin itself, to ensure they are supporting the +same interface. ## Usage -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. +To implement a new platform-specific implementation of `firebase_installations`, extend +[`FirebaseInstallationsPlatform`][2] with an implementation that performs the +platform-specific behavior, and when you register your plugin, set the default +`FirebaseInstallationsPlatform` by calling +`FirebaseInstallationsPlatform.instance = MyFirebaseInstallations()`. + +## Note on breaking changes -```dart -const like = 'sample'; -``` +Strongly prefer non-breaking changes (such as adding a method to the interface) +over breaking changes for this package. -## Additional information +See https://flutter.dev/go/platform-interface-breaking-changes for a discussion +on why a less-clean interface is preferable to a breaking change. -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +[1]: ../firebase_installations +[2]: lib/firebase_installations_platform_interface.dart diff --git a/packages/firebase_installations/firebase_installations_web/README.md b/packages/firebase_installations/firebase_installations_web/README.md index 8b55e735b501..c7f041e2a230 100644 --- a/packages/firebase_installations/firebase_installations_web/README.md +++ b/packages/firebase_installations/firebase_installations_web/README.md @@ -1,39 +1,12 @@ - +## Getting Started -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +To get started with Cloud Firestore Web, please [see the documentation](https://firebase.flutter.dev/docs/installations/overview) +available at [https://firebase.flutter.dev](https://firebase.flutter.dev) -## Features +Once installed, Firestore needs to be configured for Web Installation. Please [see the documentation](https://firebase.flutter.dev/docs/installations/overview#3-web-only-add-the-sdk) on Web Installation -TODO: List what your package can do. Maybe include images, gifs, or videos. - -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. - -## Usage - -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. - -```dart -const like = 'sample'; -``` - -## Additional information - -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +To learn more about managing Firebase Installations for you project, please visit the [Firebase website](https://firebase.google.com/docs/projects/manage-installations) From f098ff04884231f06916e9bd078094bff5c3b2ee Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 17:10:03 +0300 Subject: [PATCH 45/51] feat: enable auto injection of web SDKs --- .../firebase_core_web/lib/src/firebase_core_web.dart | 2 ++ .../firebase_installations/example/web/index.html | 2 -- .../lib/firebase_installations_web.dart | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/firebase_core/firebase_core_web/lib/src/firebase_core_web.dart b/packages/firebase_core/firebase_core_web/lib/src/firebase_core_web.dart index 649e4bd2e0c9..08b939f1d3fd 100644 --- a/packages/firebase_core/firebase_core_web/lib/src/firebase_core_web.dart +++ b/packages/firebase_core/firebase_core_web/lib/src/firebase_core_web.dart @@ -157,6 +157,8 @@ class FirebaseCoreWeb extends FirebasePlatform { 'https://www.gstatic.com/firebasejs/$version/firebase-remote-config', '@firebase/performance': 'https://www.gstatic.com/firebasejs/$version/firebase-performance', + '@firebase/installations': + 'https://www.gstatic.com/firebasejs/$version/firebase-installations', }, }) ]); diff --git a/packages/firebase_installations/firebase_installations/example/web/index.html b/packages/firebase_installations/firebase_installations/example/web/index.html index 437afed96230..27adaa918413 100644 --- a/packages/firebase_installations/firebase_installations/example/web/index.html +++ b/packages/firebase_installations/firebase_installations/example/web/index.html @@ -32,8 +32,6 @@ - - diff --git a/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart index 48a88ff71bfc..aa6a1f7ff11e 100644 --- a/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart +++ b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart @@ -5,6 +5,7 @@ library firebase_installations_web; import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_web/firebase_core_web.dart'; import 'package:firebase_core_web/firebase_core_web_interop.dart' as core_interop; import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; @@ -34,6 +35,7 @@ class FirebaseInstallationsWeb extends FirebaseInstallationsPlatform { /// Create the default instance of the [FirebaseInstallationsPlatform] as a [FirebaseInstallationsWeb] static void registerWith(Registrar registrar) { + FirebaseCoreWeb.registerService('installations'); FirebaseInstallationsPlatform.instance = FirebaseInstallationsWeb.instance; } @@ -63,7 +65,7 @@ class FirebaseInstallationsWeb extends FirebaseInstallationsPlatform { } @override - Stream get idTokenChanges { + Stream get idChanges { return guard(() => _delegate.onIdChange); } } From 9cf3537f4d3295f3bcf523458acf76da16588d6d Mon Sep 17 00:00:00 2001 From: pr_Mais Date: Sat, 4 Dec 2021 18:28:17 +0300 Subject: [PATCH 46/51] chore: rename `idTokenChanges` to `idChanges` --- .../firebase_installations/example/lib/main.dart | 2 +- .../lib/src/firebase_installations.dart | 4 ++-- .../method_channel/method_channel_firebase_installations.dart | 2 +- .../firebase_installations_platform_interface.dart | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart index dff97dd93b46..8f210ff84e3d 100644 --- a/packages/firebase_installations/firebase_installations/example/lib/main.dart +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -45,7 +45,7 @@ class _InstallationsCardState extends State { init(); // Listen to changes - FirebaseInstallations.instance.idTokenChanges.listen((event) { + FirebaseInstallations.instance.idChanges.listen((event) { setState(() { id = event; }); diff --git a/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart b/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart index 8d7abe936ba6..65da91be33d8 100644 --- a/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart @@ -56,7 +56,7 @@ class FirebaseInstallations extends FirebasePluginPlatform { } /// Sends a new event via a [Stream] whenever the Installation ID changes. - Stream get idTokenChanges { - return _delegate.idTokenChanges; + Stream get idChanges { + return _delegate.idChanges; } } diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart index 42cd4d44af86..35feeea0e720 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart @@ -100,7 +100,7 @@ class MethodChannelFirebaseInstallations extends FirebaseInstallationsPlatform { } @override - Stream get idTokenChanges { + Stream get idChanges { return _idTokenChangesListeners[app!.name]!.stream; } } diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart index 6e0f4fde626b..238591c84660 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart @@ -63,7 +63,7 @@ abstract class FirebaseInstallationsPlatform extends PlatformInterface { } /// Sends a new event via a [Stream] whenever the Installation ID changes. - Stream get idTokenChanges { + Stream get idChanges { throw UnimplementedError('get idTokenChanges is not implemented'); } } From 9eb0353f380c60726a10bb5ef76de1bc5c5c4834 Mon Sep 17 00:00:00 2001 From: Salakar Date: Mon, 6 Dec 2021 09:18:47 +0000 Subject: [PATCH 47/51] cleanup --- .github/workflows/firebase_installations.yaml | 4 ++-- docs/installations/overview.mdx | 12 +++++------ docs/installations/usage.mdx | 20 +++++++++---------- docs/versions.js | 2 +- .../firebase_installations/README.md | 2 +- .../example/lib/main.dart | 4 ++-- .../example/pubspec.yaml | 8 ++++++-- ...art => flutterfire_installations_e2e.dart} | 2 +- ...> flutterfire_installations_e2e_test.dart} | 0 ...ns.dart => flutterfire_installations.dart} | 4 ++-- ...ns.dart => flutterfire_installations.dart} | 6 +++--- .../firebase_installations/pubspec.yaml | 7 ++++--- .../test/firebase_installations_test.dart | 2 +- .../README.md | 4 ++-- ...method_channel_firebase_installations.dart | 2 +- ...base_installations_platform_interface.dart | 4 ++-- .../firebase_installations_web/README.md | 6 +++--- .../lib/firebase_installations_web.dart | 2 +- website/plugins.js | 2 +- 19 files changed, 49 insertions(+), 44 deletions(-) rename packages/firebase_installations/firebase_installations/example/test_driver/{firebase_installations_e2e.dart => flutterfire_installations_e2e.dart} (94%) rename packages/firebase_installations/firebase_installations/example/test_driver/{firebase_installations_e2e_test.dart => flutterfire_installations_e2e_test.dart} (100%) rename packages/firebase_installations/firebase_installations/lib/{firebase_installations.dart => flutterfire_installations.dart} (86%) rename packages/firebase_installations/firebase_installations/lib/src/{firebase_installations.dart => flutterfire_installations.dart} (95%) diff --git a/.github/workflows/firebase_installations.yaml b/.github/workflows/firebase_installations.yaml index 314d6eeb4f8a..59125449cffa 100644 --- a/.github/workflows/firebase_installations.yaml +++ b/.github/workflows/firebase_installations.yaml @@ -13,8 +13,8 @@ on: - '**.md' env: - FLUTTERFIRE_PLUGIN_SCOPE: '*firebase_installations*' - FLUTTERFIRE_PLUGIN_SCOPE_EXAMPLE: '*firebase_installations_example*' + FLUTTERFIRE_PLUGIN_SCOPE: '*installations*' + FLUTTERFIRE_PLUGIN_SCOPE_EXAMPLE: '*installations_example*' jobs: android: diff --git a/docs/installations/overview.mdx b/docs/installations/overview.mdx index f96056006d27..393e42f14e01 100644 --- a/docs/installations/overview.mdx +++ b/docs/installations/overview.mdx @@ -18,22 +18,22 @@ Internally, the installation ID is used by the following Firebase Services: - Firebase Remote Config - Firebase ML -Tpically, Firebase services use the Firebase installations service without requiring developers to interact directly with the FIS API. However, there are cases where app developers might want to directly call the FIS API, such as: +Typically, Firebase services use the Firebase installations service without requiring developers to interact directly with the FIS API. However, there are cases where app developers might want to directly call the FIS API, such as: -- To delete a Firebase installation and data tied to the installation. -- To retrieve identifiers (Firebase installation IDs) in order to target specific app installations. -- To retrieve installation auth tokens to authenticate Firebase installations. +- Delete a Firebase installation and data tied to the installation. +- Retrieve identifiers (Firebase installation IDs) in order to target specific app installations. +- Retrieve installation auth tokens to authenticate Firebase installations. ## Installation -Add the `firebase_installations` dependency to your projects `pubspec.yaml` file: +Add the `flutterfire_installations` dependency to your projects `pubspec.yaml` file: ```yaml {5} title="pubspec.yaml" dependencies: flutter: sdk: flutter firebase_core: "^{{ plugins.firebase_core_ns }}" - firebase_installations: "^{{ plugins.firebase_installations_ns }}" + flutterfire_installations: "^{{ plugins.flutterfire_installations_ns }}" ``` ### 2. Download dependency diff --git a/docs/installations/usage.mdx b/docs/installations/usage.mdx index a63d86dd0496..c5b40cf45ee3 100644 --- a/docs/installations/usage.mdx +++ b/docs/installations/usage.mdx @@ -6,7 +6,7 @@ sidebar_label: Usage To start using the Firebase Installations package within your project, import it at the top of your project files: ```dart -import 'package:firebase_installations/firebase_installations.dart'; +import 'package:flutterfire_installations/flutterfire_installations.dart'; ``` Before using Firebase Installations, you must first have ensured you have [initialized FlutterFire](../overview.mdx#initializing-flutterfire). @@ -45,7 +45,7 @@ To delete an FID, call the `delete` method on the [`FirebaseInstallations`](!fir await FirebaseInstallations.instance.delete(); ``` -## Retrieve client identifers +## Retrieve client identifiers If you have a requirement to identify particular installations of your app, you can do so by retrieving the Firebase installation ID. For example, to perform testing during Firebase In-App Messaging development, you can identify and target the correct test device using @@ -65,8 +65,8 @@ you can authenticate a targeted test device using an installation auth token. An installation auth token is a short-lived bearer token in JSON web token (JWT) format containing the following information for an installation: - The Firebase installation ID -- The associated project (projectNumber) -- The associated Firebase application ID (appId) +- The associated project (`projectNumber`) +- The associated Firebase application ID (`appId`) - The token's expiration date An installation auth token cannot be revoked, and remains valid until its expiration date. The default token lifetime is one week. @@ -83,24 +83,24 @@ Optionally, you can force a token refresh when called: String token = await FirebaseInstallations.instance.getToken(true); ``` -## Monitor the Firebase installation ID lifecycle +## Monitor the Firebase Installation ID -During the normal operation of an app, Firebase installation IDs (FIDs) don't require special monitoring. However, apps that explictly retrieve and +During the normal operation of an app, Firebase installation IDs (FIDs) don't require special monitoring. However, apps that explicitly retrieve and use FIDs should add logic to monitor the potential deletion or rotation of the FID. Here are some cases where FIDs could be deleted or rotated: -- Uninstallation or reinstallation of the app, for instance when an end user installs on a new device. +- Uninstallation or re-installation of the app, for instance when an end user installs on a new device. - The end user clears the cache of the app or the device. - FID deletion is triggered in the backend due to app inactivity (currently the threshold for this is 270 days of inactivity). -When apps experience FID rotation or deletion in these kinds of cases, they are assigned a new FID. Also, the installation auth token associated with +When apps experience a FID rotation or deletion in these kinds of cases, they are assigned a new FID. Also, the installation auth token associated with a deleted FID is deleted, regardless of its own maturity, and is replaced with a new installation auth token. Apps can monitor these changes and respond accordingly. -To monitor the FID token, listen to the `Stream` returned from the `idTokenChanges` getter: +To monitor the FID token, listen to the `Stream` returned from the `onIdChange` getter: ```dart -FirebaseInstallations.instance.idTokenChanges.listen((token) { +FirebaseInstallations.instance.onIdChange.listen((token) { print('FID token: $token'); }); ``` diff --git a/docs/versions.js b/docs/versions.js index 158068e201f2..128d6e89b742 100644 --- a/docs/versions.js +++ b/docs/versions.js @@ -31,7 +31,7 @@ export default { firebase_performance_ns: PUB_NS_FIREBASE_PERFORMANCE, firebase_remote_config: PUB_FIREBASE_REMOTE_CONFIG, firebase_remote_config_ns: PUB_NS_FIREBASE_REMOTE_CONFIG, - firebase_installations_ns: PUB_NS_FIREBASE_INSTALLATIONS, + flutterfire_installations: PUB_NS_FLUTTERFIRE_INSTALLATIONS, google_sign_in: '^4.4.4', }, android: { diff --git a/packages/firebase_installations/firebase_installations/README.md b/packages/firebase_installations/firebase_installations/README.md index 82997b0d8659..f905a19cb839 100644 --- a/packages/firebase_installations/firebase_installations/README.md +++ b/packages/firebase_installations/firebase_installations/README.md @@ -2,7 +2,7 @@ A Flutter plugin to use the [Firebase Installations API](https://firebase.google.com/docs/projects/manage-installations). -[![pub package](https://img.shields.io/pub/v/firebase_installations.svg)](https://pub.dev/packages/firebase_installations) +[![pub package](https://img.shields.io/pub/v/flutterfire_installations.svg)](https://pub.dev/packages/flutterfire_installations) ## Getting Started diff --git a/packages/firebase_installations/firebase_installations/example/lib/main.dart b/packages/firebase_installations/firebase_installations/example/lib/main.dart index 8f210ff84e3d..8c8e1dd62e9a 100644 --- a/packages/firebase_installations/firebase_installations/example/lib/main.dart +++ b/packages/firebase_installations/firebase_installations/example/lib/main.dart @@ -4,7 +4,7 @@ import 'package:firebase_installations_example/firebase_config.dart'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_installations/firebase_installations.dart'; +import 'package:flutterfire_installations/flutterfire_installations.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -45,7 +45,7 @@ class _InstallationsCardState extends State { init(); // Listen to changes - FirebaseInstallations.instance.idChanges.listen((event) { + FirebaseInstallations.instance.onIdChange.listen((event) { setState(() { id = event; }); diff --git a/packages/firebase_installations/firebase_installations/example/pubspec.yaml b/packages/firebase_installations/firebase_installations/example/pubspec.yaml index 708b85541971..805605bea706 100644 --- a/packages/firebase_installations/firebase_installations/example/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/example/pubspec.yaml @@ -28,7 +28,7 @@ environment: # versions available, run `flutter pub outdated`. dependencies: firebase_core: ^1.10.0 - firebase_installations: + flutterfire_installations: path: ../ flutter: sdk: flutter @@ -36,7 +36,11 @@ dependencies: dependency_overrides: firebase_core: path: ../../../firebase_core/firebase_core - + firebase_installations_web: + path: ../../firebase_installations_web + firebase_installations_platform_interface: + path: ../../firebase_installations_platform_interface + dev_dependencies: drive: ^1.0.0-1.0.nullsafety.1 flutter_driver: diff --git a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart b/packages/firebase_installations/firebase_installations/example/test_driver/flutterfire_installations_e2e.dart similarity index 94% rename from packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart rename to packages/firebase_installations/firebase_installations/example/test_driver/flutterfire_installations_e2e.dart index 1f2f6b0ab45c..bb98192407b1 100644 --- a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e.dart +++ b/packages/firebase_installations/firebase_installations/example/test_driver/flutterfire_installations_e2e.dart @@ -4,7 +4,7 @@ import 'package:drive/drive.dart' as drive; import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_installations/firebase_installations.dart'; +import 'package:flutterfire_installations/flutterfire_installations.dart'; import 'package:flutter_test/flutter_test.dart'; import 'firebase_config.dart'; diff --git a/packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e_test.dart b/packages/firebase_installations/firebase_installations/example/test_driver/flutterfire_installations_e2e_test.dart similarity index 100% rename from packages/firebase_installations/firebase_installations/example/test_driver/firebase_installations_e2e_test.dart rename to packages/firebase_installations/firebase_installations/example/test_driver/flutterfire_installations_e2e_test.dart diff --git a/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart b/packages/firebase_installations/firebase_installations/lib/flutterfire_installations.dart similarity index 86% rename from packages/firebase_installations/firebase_installations/lib/firebase_installations.dart rename to packages/firebase_installations/firebase_installations/lib/flutterfire_installations.dart index 2b0a9e656263..456ea64ec417 100644 --- a/packages/firebase_installations/firebase_installations/lib/firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations/lib/flutterfire_installations.dart @@ -2,11 +2,11 @@ // 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. -library firebase_installations; +library flutterfire_installations; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart' show FirebasePluginPlatform; import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; -part 'src/firebase_installations.dart'; +part 'src/flutterfire_installations.dart'; diff --git a/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart b/packages/firebase_installations/firebase_installations/lib/src/flutterfire_installations.dart similarity index 95% rename from packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart rename to packages/firebase_installations/firebase_installations/lib/src/flutterfire_installations.dart index 65da91be33d8..3fbc142f23a4 100644 --- a/packages/firebase_installations/firebase_installations/lib/src/firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations/lib/src/flutterfire_installations.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -part of firebase_installations; +part of flutterfire_installations; class FirebaseInstallations extends FirebasePluginPlatform { FirebaseInstallations._({required this.app}) @@ -56,7 +56,7 @@ class FirebaseInstallations extends FirebasePluginPlatform { } /// Sends a new event via a [Stream] whenever the Installation ID changes. - Stream get idChanges { - return _delegate.idChanges; + Stream get onIdChange { + return _delegate.onIdChange; } } diff --git a/packages/firebase_installations/firebase_installations/pubspec.yaml b/packages/firebase_installations/firebase_installations/pubspec.yaml index 6dc2adb41772..e588b8843ac1 100644 --- a/packages/firebase_installations/firebase_installations/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/pubspec.yaml @@ -1,12 +1,13 @@ -name: firebase_installations +# FlutterFire_X naming due to package being take already on Pub.dev. +name: flutterfire_installations description: A Flutter plugin allowing you to use Firebase Installations. version: 0.0.1 homepage: https://firebase.flutter.dev/docs/installations/overview repository: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations environment: - sdk: '>=2.12.0 <3.0.0' - flutter: '>=1.20.0' + sdk: ">=2.12.0 <3.0.0" + flutter: ">=1.20.0" dependencies: firebase_core: ^1.10.0 diff --git a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart index 3eaaa5da8673..6893112283e5 100644 --- a/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart +++ b/packages/firebase_installations/firebase_installations/test/firebase_installations_test.dart @@ -5,7 +5,7 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; -import 'package:firebase_installations/firebase_installations.dart'; +import 'package:flutterfire_installations/flutterfire_installations.dart'; import 'package:firebase_installations_platform_interface/firebase_installations_platform_interface.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; diff --git a/packages/firebase_installations/firebase_installations_platform_interface/README.md b/packages/firebase_installations/firebase_installations_platform_interface/README.md index 3aff0262f878..00f6dfe07c3c 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/README.md +++ b/packages/firebase_installations/firebase_installations_platform_interface/README.md @@ -2,13 +2,13 @@ A common platform interface for the [`firebase_installations`][1] plugin. -This interface allows platform-specific implementations of the `cloud_firestore` +This interface allows platform-specific implementations of the `flutterfire_installations` plugin, as well as the plugin itself, to ensure they are supporting the same interface. ## Usage -To implement a new platform-specific implementation of `firebase_installations`, extend +To implement a new platform-specific implementation of `flutterfire_installations`, extend [`FirebaseInstallationsPlatform`][2] with an implementation that performs the platform-specific behavior, and when you register your plugin, set the default `FirebaseInstallationsPlatform` by calling diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart index 35feeea0e720..debfe37e5924 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart @@ -100,7 +100,7 @@ class MethodChannelFirebaseInstallations extends FirebaseInstallationsPlatform { } @override - Stream get idChanges { + Stream get onIdChange { return _idTokenChangesListeners[app!.name]!.stream; } } diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart index 238591c84660..14ee6412ea35 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/platform_interface/firebase_installations_platform_interface.dart @@ -63,7 +63,7 @@ abstract class FirebaseInstallationsPlatform extends PlatformInterface { } /// Sends a new event via a [Stream] whenever the Installation ID changes. - Stream get idChanges { - throw UnimplementedError('get idTokenChanges is not implemented'); + Stream get onIdChange { + throw UnimplementedError('get onIdChange is not implemented'); } } diff --git a/packages/firebase_installations/firebase_installations_web/README.md b/packages/firebase_installations/firebase_installations_web/README.md index c7f041e2a230..001155ac60ea 100644 --- a/packages/firebase_installations/firebase_installations_web/README.md +++ b/packages/firebase_installations/firebase_installations_web/README.md @@ -1,12 +1,12 @@ # firebase_installations_web -The web implementation of `firebase_installations`. +The web implementation of `flutterfire_installations`. ## Getting Started -To get started with Cloud Firestore Web, please [see the documentation](https://firebase.flutter.dev/docs/installations/overview) +To get started with Firebase Installations Web, please [see the documentation](https://firebase.flutter.dev/docs/installations/overview) available at [https://firebase.flutter.dev](https://firebase.flutter.dev) -Once installed, Firestore needs to be configured for Web Installation. Please [see the documentation](https://firebase.flutter.dev/docs/installations/overview#3-web-only-add-the-sdk) on Web Installation +Once installed, Firebase Installations needs to be configured for Web Installation. Please [see the documentation](https://firebase.flutter.dev/docs/installations/overview#3-web-only-add-the-sdk) on Web Installation To learn more about managing Firebase Installations for you project, please visit the [Firebase website](https://firebase.google.com/docs/projects/manage-installations) diff --git a/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart index aa6a1f7ff11e..f2f63fbef3df 100644 --- a/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart +++ b/packages/firebase_installations/firebase_installations_web/lib/firebase_installations_web.dart @@ -65,7 +65,7 @@ class FirebaseInstallationsWeb extends FirebaseInstallationsPlatform { } @override - Stream get idChanges { + Stream get onIdChange { return guard(() => _delegate.onIdChange); } } diff --git a/website/plugins.js b/website/plugins.js index 19a02b437d88..4ab7ab4d10ee 100644 --- a/website/plugins.js +++ b/website/plugins.js @@ -73,7 +73,7 @@ module.exports = [ }, { name: 'Installations', - pub: 'installations', + pub: 'flutterfire_installations', firebase: 'https://firebase.google.com/docs/projects/manage-installations', status: 'Stable', documentation: 'https://firebase.flutter.dev/docs/installations/overview', From 61938c3db9158c16a83d3fc6283d5b2b759b8bf6 Mon Sep 17 00:00:00 2001 From: Salakar Date: Mon, 6 Dec 2021 11:06:03 +0000 Subject: [PATCH 48/51] ios cleanup --- .../FirebaseInstallationsPlugin.java | 6 +- .../ios/Classes/FirebaseInstallationsPlugin.m | 8 +- ...wift => FirebaseInstallationsPlugin.swift} | 172 ++++++++---------- .../ios/Classes/IdChangedStreamHandler.swift | 67 ++++--- ...spec => flutterfire_installations.podspec} | 17 +- ...method_channel_firebase_installations.dart | 24 ++- 6 files changed, 132 insertions(+), 162 deletions(-) rename packages/firebase_installations/firebase_installations/ios/Classes/{SwiftFirebaseInstallationsPlugin.swift => FirebaseInstallationsPlugin.swift} (50%) rename packages/firebase_installations/firebase_installations/ios/{firebase_installations.podspec => flutterfire_installations.podspec} (77%) diff --git a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java index 492405f65a4d..8f2e65d7f000 100644 --- a/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java +++ b/packages/firebase_installations/firebase_installations/android/src/main/java/io/flutter/plugins/firebase/installations/firebase_installations/FirebaseInstallationsPlugin.java @@ -79,7 +79,7 @@ private Task getToken(Map arguments) { }); } - private Task registerTokenListener(Map arguments) { + private Task registerIdChangeListener(Map arguments) { return Tasks.call( cachedThreadPool, () -> { @@ -115,8 +115,8 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { case "FirebaseInstallations#delete": methodCallTask = deleteId(call.arguments()); break; - case "FirebaseInstallations#registerIdTokenListener": - methodCallTask = registerTokenListener(call.arguments()); + case "FirebaseInstallations#registerIdChangeListener": + methodCallTask = registerIdChangeListener(call.arguments()); break; default: diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m index 94b5ab3c3631..a701b6acbc50 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.m @@ -3,18 +3,18 @@ // found in the LICENSE file. #import "FirebaseInstallationsPlugin.h" -#if __has_include() -#import +#if __has_include() +#import #else // Support project import fallback if the generated compatibility header // is not copied when this plugin is created as a library. // https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 -#import "firebase_installations-Swift.h" +#import "flutterfire_installations-Swift.h" #endif @implementation FirebaseInstallationsPlugin + (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftFirebaseInstallationsPlugin registerWithRegistrar:registrar]; + [FirebaseInstallationsPluginSwift registerWithRegistrar:registrar]; } - (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.swift similarity index 50% rename from packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift rename to packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.swift index c0c38b6ed6e9..a4338e4ba9a7 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/SwiftFirebaseInstallationsPlugin.swift +++ b/packages/firebase_installations/firebase_installations/ios/Classes/FirebaseInstallationsPlugin.swift @@ -3,187 +3,159 @@ // found in the LICENSE file. #if canImport(FlutterMacOS) -import FlutterMacOS + import FlutterMacOS #else -import Flutter + import Flutter #endif import firebase_core import FirebaseInstallations -let kFLTFirebaseInstallationsChannelName = "plugins.flutter.io/firebase_installations"; +let kFLTFirebaseInstallationsChannelName = "plugins.flutter.io/firebase_installations" -public class SwiftFirebaseInstallationsPlugin: FLTFirebasePlugin, FlutterPlugin { - +public class FirebaseInstallationsPluginSwift: FLTFirebasePlugin, FlutterPlugin { private var eventSink: FlutterEventSink? - private var messenger:FlutterBinaryMessenger; - - var result:FLTFirebaseMethodCallResult?; - var streamHandler = Dictionary(); - - var args = NSDictionary.init(); - - init(messenger:FlutterBinaryMessenger) { - self.messenger = messenger; + private var messenger: FlutterBinaryMessenger + + var result: FLTFirebaseMethodCallResult? + var streamHandler = [String: IdChangedStreamHandler?]() + + var args = NSDictionary() + + init(messenger: FlutterBinaryMessenger) { + self.messenger = messenger } - + public static func register(with registrar: FlutterPluginRegistrar) { - let binaryMessenger:FlutterBinaryMessenger; - + let binaryMessenger: FlutterBinaryMessenger + #if os(macOS) binaryMessenger = registrar.messenger #elseif os(iOS) binaryMessenger = registrar.messenger() #endif - + let channel = FlutterMethodChannel(name: kFLTFirebaseInstallationsChannelName, binaryMessenger: binaryMessenger) - let instance = SwiftFirebaseInstallationsPlugin(messenger: binaryMessenger) + let instance = FirebaseInstallationsPluginSwift(messenger: binaryMessenger) registrar.addMethodCallDelegate(instance, channel: channel) } - - @objc private func onIdChanged(notification: NSNotification) { - print("changed") - } - + /// Gets Installations instance for a Firebase App. /// - Returns: a Firebase Installations instance for the passed app from Dart internal func getInstallations() -> Installations { - let appName = FLTFirebasePlugin.firebaseAppName(fromDartName: (args["appName"] as! String)) - let app:FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(appName)! + let app: FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(args["appName"] as! String)! return Installations.installations(app: app) } - + /// Gets Installations Id for an instance. /// - Parameter arguments: the arguments passed by the Dart calling method /// - Parameter result: the result instance used to send the result to Dart. internal func getId() { - let instance:Installations = getInstallations(); - - var installationsId:String = "" - - instance.installationID { (id:String?, error:Error?) in + let instance: Installations = getInstallations() + instance.installationID { (id: String?, error: Error?) in if error != nil { self.result!.error(nil, nil, nil, error) } else { - installationsId = id ?? "" - NSLog("Firebase Installation ID: %@", installationsId) - self.result!.success(id) } - - } } - + /// Deletes Installations Id for an instance. internal func deleteId() { - let instance:Installations = getInstallations(); - - instance.delete { (error:Error?) in + let instance: Installations = getInstallations() + instance.delete { (error: Error?) in if error != nil { self.result!.error(nil, nil, nil, error) } else { - NSLog("Firebase Installation ID deleted successfully.") self.result!.success(nil) } } - } - + /// Gets the token Id for an instance. internal func getToken() { - let instance:Installations = getInstallations(); - - var installationsAuthToken:String = "" - - let forceRefresh:Bool = (args["forceRefresh"] as? Bool) ?? false; - - instance.authTokenForcingRefresh (forceRefresh, completion: {(tokenResult:InstallationsAuthTokenResult?, error:Error?) in + let instance: Installations = getInstallations() + let forceRefresh: Bool = (args["forceRefresh"] as? Bool) ?? false + + instance.authTokenForcingRefresh(forceRefresh, completion: { (tokenResult: InstallationsAuthTokenResult?, error: Error?) in if error != nil { self.result!.error(nil, nil, nil, error) } else { - installationsAuthToken = tokenResult?.authToken ?? "" - - NSLog("Firebase Installation Auth Token: %@", installationsAuthToken) - - self.result!.success(installationsAuthToken) + self.result!.success(tokenResult?.authToken) } - }); + }) } - + /// Starts listening to Installation ID events for an instance. - internal func registerTokenListener() { - let instance:Installations = getInstallations(); - + internal func registerIdChangeListener() { + let instance: Installations = getInstallations() + let appName = (args["appName"] as! String) - let eventChannelName:String = kFLTFirebaseInstallationsChannelName + "/token/" + appName; - + let eventChannelName: String = kFLTFirebaseInstallationsChannelName + "/token/" + appName + let eventChannel = FlutterEventChannel(name: eventChannelName, binaryMessenger: messenger) - - if (self.streamHandler[eventChannelName] == nil) { - self.streamHandler[eventChannelName] = IdChangedStreamHandler(instance: instance) + + if streamHandler[eventChannelName] == nil { + streamHandler[eventChannelName] = IdChangedStreamHandler(instance: instance) } - - eventChannel.setStreamHandler((self.streamHandler[eventChannelName]!)) - + + eventChannel.setStreamHandler(streamHandler[eventChannelName]!) + result?.success(eventChannelName) } - - - internal func mapInstallationsErrorCodes(code:UInt) -> NSString { - let error = InstallationsErrorCode.init(rawValue: code) ?? InstallationsErrorCode.unknown; - + + internal func mapInstallationsErrorCodes(code: UInt) -> NSString { + let error = InstallationsErrorCode(rawValue: code) ?? InstallationsErrorCode.unknown + switch error { case InstallationsErrorCode.invalidConfiguration: - return "invalid-configuration"; + return "invalid-configuration" case InstallationsErrorCode.keychain: - return "invalid-keychain"; + return "invalid-keychain" case InstallationsErrorCode.serverUnreachable: - return "server-unreachable"; + return "server-unreachable" case InstallationsErrorCode.unknown: - return "unknown"; + return "unknown" default: - return "unknown"; + return "unknown" } } - - + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { let args = call.arguments as! NSDictionary - - let errorBlock:FLTFirebaseMethodCallErrorBlock = { (code, message, details, error:Error?) in - var errorDetails:Dictionary = Dictionary(); - - errorDetails["code"] = code ?? self.mapInstallationsErrorCodes(code:UInt((error! as NSError).code)) - errorDetails["message"] = message ?? error?.localizedDescription ?? "An unknown error has occurred."; + + let errorBlock: FLTFirebaseMethodCallErrorBlock = { (code, message, details, error: Error?) in + var errorDetails = [String: Any?]() + + errorDetails["code"] = code ?? self.mapInstallationsErrorCodes(code: UInt((error! as NSError).code)) + errorDetails["message"] = message ?? error?.localizedDescription ?? "An unknown error has occurred." errorDetails["additionalData"] = details - - - if(code == "unknown") { - NSLog("FLTFirebaseInstallations: An error occured while calling method %@", call.method) + + if code == "unknown" { + NSLog("FLTFirebaseInstallations: An error occurred while calling method %@", call.method) } - + result(FLTFirebasePlugin.createFlutterError(fromCode: errorDetails["code"] as! String, message: errorDetails["message"] as! String, - optionalDetails: (errorDetails["additionalData"] as? [AnyHashable : Any]), + optionalDetails: errorDetails["additionalData"] as? [AnyHashable: Any], andOptionalNSError: error)) - }; - + } + self.result = .create(success: result, andErrorBlock: errorBlock) self.args = args - - switch (call.method) { + + switch call.method { case "FirebaseInstallations#getId": getId() case "FirebaseInstallations#delete": deleteId() case "FirebaseInstallations#getToken": getToken() - case "FirebaseInstallations#registerIdTokenListener": - registerTokenListener() + case "FirebaseInstallations#registerIdChangeListener": + registerIdChangeListener() default: result(FlutterMethodNotImplemented) } - } } diff --git a/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift index 052ba630498c..e20f95685d86 100644 --- a/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift +++ b/packages/firebase_installations/firebase_installations/ios/Classes/IdChangedStreamHandler.swift @@ -2,57 +2,52 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import Foundation +#if canImport(FlutterMacOS) + import FlutterMacOS +#else + import Flutter +#endif + import FirebaseInstallations +import Foundation class IdChangedStreamHandler: NSObject, FlutterStreamHandler { - - - var eventSink: FlutterEventSink?; - var installationIDObserver: NSObjectProtocol?; - var instance:Installations; - var installationsId:String = ""; - + var eventSink: FlutterEventSink? + var installationIDObserver: NSObjectProtocol? + var instance: Installations + var installationsId: String = "" + init(instance: Installations) { - self.instance = instance; + self.instance = instance } - - @objc func handleInstallationIDChange() { - var events = Dictionary(); - - // Fetch new installation Id - instance.installationID { (newId:String?, error:Error?) in - if error != nil { - self.eventSink!(FlutterError()) - } else { - if(newId != self.installationsId) { - self.installationsId = newId!; - events["token"] = self.installationsId; - self.eventSink!(events) - } - } + + internal func handleIdChange() { + var events = [String: String]() + instance.installationID { (newId: String?, error: Error?) in + if error != nil { + self.eventSink!(FlutterError.init(code: "unknown", message: error?.localizedDescription, details: ["code": "unknown", "message": error?.localizedDescription])) + } else if newId != self.installationsId { + self.installationsId = newId! + events["token"] = self.installationsId + self.eventSink!(events) } } - - public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { + } + + public func onListen(withArguments _: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { eventSink = events - - // [START handle_installation_id_change] installationIDObserver = NotificationCenter.default.addObserver( forName: .InstallationIDDidChange, object: nil, queue: nil - ) { (notification) in - self.handleInstallationIDChange() + ) { _ in + self.handleIdChange() } - // [END handle_installation_id_change] - return nil } - - public func onCancel(withArguments arguments: Any?) -> FlutterError? { - self.eventSink = nil + + public func onCancel(withArguments _: Any?) -> FlutterError? { + eventSink = nil return nil } - } diff --git a/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec b/packages/firebase_installations/firebase_installations/ios/flutterfire_installations.podspec similarity index 77% rename from packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec rename to packages/firebase_installations/firebase_installations/ios/flutterfire_installations.podspec index cb12a57ecba5..6df0a00e1e1b 100644 --- a/packages/firebase_installations/firebase_installations/ios/firebase_installations.podspec +++ b/packages/firebase_installations/firebase_installations/ios/flutterfire_installations.podspec @@ -16,19 +16,16 @@ else end Pod::Spec.new do |s| - s.name = 'firebase_installations' - s.version = '0.0.1' - s.summary = 'A new flutter plugin project.' - s.description = <<-DESC -A new flutter plugin project. - DESC - s.homepage = 'http://example.com' + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] s.license = { :file => '../LICENSE' } - s.author = { 'Your Company' => 'email@example.com' } + s.authors = 'The Chromium Authors' s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/*.h' + s.public_header_files = 'Classes/**/*.h' s.ios.deployment_target = '10.0' diff --git a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart index debfe37e5924..6a095a68808e 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart +++ b/packages/firebase_installations/firebase_installations_platform_interface/lib/src/method_channel/method_channel_firebase_installations.dart @@ -29,22 +29,28 @@ class MethodChannelFirebaseInstallations extends FirebaseInstallationsPlatform { MethodChannelFirebaseInstallations({required FirebaseApp app}) : super(app) { _idTokenChangesListeners[app.name] = StreamController.broadcast(); - channel - .invokeMethod('FirebaseInstallations#registerIdTokenListener', { + channel.invokeMethod( + 'FirebaseInstallations#registerIdChangeListener', { 'appName': app.name, }).then((channelName) { final events = EventChannel(channelName!, channel.codec); - events.receiveBroadcastStream().listen( - (arguments) { - _handleIdTokenChangesListener(app.name, arguments); - }, - ); + events.receiveBroadcastStream().listen((arguments) { + _handleIdChangedListener(app.name, arguments); + }, onError: (error, stackTrace) { + _handleIdChangedError(app.name, error, stackTrace); + }); }); } + void _handleIdChangedError(String appName, Object error, + [StackTrace? stackTrace]) { + final StreamController controller = + _idTokenChangesListeners[appName]!; + controller.addError(convertPlatformException(error), stackTrace); + } /// Handle any incoming events from Event Channel and forward on to the user. - Future _handleIdTokenChangesListener( - String appName, Map arguments) async { + void _handleIdChangedListener( + String appName, Map arguments) { final StreamController controller = _idTokenChangesListeners[appName]!; controller.add(arguments['token']); From f8e20929ed005454b76f5e3a1b249077dab307c6 Mon Sep 17 00:00:00 2001 From: Salakar Date: Mon, 6 Dec 2021 11:25:06 +0000 Subject: [PATCH 49/51] bump versions and fix symlink --- .../firebase_installations/CHANGELOG.md | 4 ++-- .../macos/Classes/FirebaseInstallationsPlugin.swift | 1 + .../macos/Classes/SwiftFirebaseInstallationsPlugin.swift | 1 - .../firebase_installations/pubspec.yaml | 6 +++--- .../firebase_installations_platform_interface/CHANGELOG.md | 4 ++-- .../firebase_installations_platform_interface/pubspec.yaml | 2 +- .../firebase_installations_web/CHANGELOG.md | 2 +- .../firebase_installations_web/pubspec.yaml | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) create mode 120000 packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.swift delete mode 120000 packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift diff --git a/packages/firebase_installations/firebase_installations/CHANGELOG.md b/packages/firebase_installations/firebase_installations/CHANGELOG.md index 41cc7d8192ec..c9e662fb6d43 100644 --- a/packages/firebase_installations/firebase_installations/CHANGELOG.md +++ b/packages/firebase_installations/firebase_installations/CHANGELOG.md @@ -1,3 +1,3 @@ -## 0.0.1 +## 0.1.0 -* TODO: Describe initial release. + - Initial release of the Firebase Installations plugin. diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.swift new file mode 120000 index 000000000000..c65783793f21 --- /dev/null +++ b/packages/firebase_installations/firebase_installations/macos/Classes/FirebaseInstallationsPlugin.swift @@ -0,0 +1 @@ +../../ios/Classes/FirebaseInstallationsPlugin.swift \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift b/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift deleted file mode 120000 index 91f5e6574d86..000000000000 --- a/packages/firebase_installations/firebase_installations/macos/Classes/SwiftFirebaseInstallationsPlugin.swift +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/SwiftFirebaseInstallationsPlugin.swift \ No newline at end of file diff --git a/packages/firebase_installations/firebase_installations/pubspec.yaml b/packages/firebase_installations/firebase_installations/pubspec.yaml index e588b8843ac1..1af5fc2f994e 100644 --- a/packages/firebase_installations/firebase_installations/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations/pubspec.yaml @@ -1,7 +1,7 @@ # FlutterFire_X naming due to package being take already on Pub.dev. name: flutterfire_installations description: A Flutter plugin allowing you to use Firebase Installations. -version: 0.0.1 +version: 0.1.0 homepage: https://firebase.flutter.dev/docs/installations/overview repository: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations @@ -12,8 +12,8 @@ environment: dependencies: firebase_core: ^1.10.0 firebase_core_platform_interface: ^4.1.0 - firebase_installations_platform_interface: ^0.0.1 - firebase_installations_web: ^0.0.1 + firebase_installations_platform_interface: ^0.1.0 + firebase_installations_web: ^0.1.0 flutter: sdk: flutter diff --git a/packages/firebase_installations/firebase_installations_platform_interface/CHANGELOG.md b/packages/firebase_installations/firebase_installations_platform_interface/CHANGELOG.md index 41cc7d8192ec..c9e662fb6d43 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/CHANGELOG.md +++ b/packages/firebase_installations/firebase_installations_platform_interface/CHANGELOG.md @@ -1,3 +1,3 @@ -## 0.0.1 +## 0.1.0 -* TODO: Describe initial release. + - Initial release of the Firebase Installations plugin. diff --git a/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml b/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml index 5c81fa479a8c..d2787862cdd7 100644 --- a/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations_platform_interface/pubspec.yaml @@ -1,6 +1,6 @@ name: firebase_installations_platform_interface description: A common platform interface for the firebase_installations plugin. -version: 0.0.1 +version: 0.1.0 homepage: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations_platform_interface repository: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations_platform_interface diff --git a/packages/firebase_installations/firebase_installations_web/CHANGELOG.md b/packages/firebase_installations/firebase_installations_web/CHANGELOG.md index 8992730a2603..c9e662fb6d43 100644 --- a/packages/firebase_installations/firebase_installations_web/CHANGELOG.md +++ b/packages/firebase_installations/firebase_installations_web/CHANGELOG.md @@ -1,3 +1,3 @@ -## 0.0.1 +## 0.1.0 - Initial release of the Firebase Installations plugin. diff --git a/packages/firebase_installations/firebase_installations_web/pubspec.yaml b/packages/firebase_installations/firebase_installations_web/pubspec.yaml index b1f0393d953d..f6b882390934 100644 --- a/packages/firebase_installations/firebase_installations_web/pubspec.yaml +++ b/packages/firebase_installations/firebase_installations_web/pubspec.yaml @@ -1,6 +1,6 @@ name: firebase_installations_web description: The web implementation of firebase_installations. -version: 0.0.1 +version: 0.1.0 homepage: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations_web repository: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_installations/firebase_installations_web @@ -9,7 +9,7 @@ environment: flutter: '>=1.17.0' dependencies: - firebase_installations_platform_interface: ^0.0.1 + firebase_installations_platform_interface: ^0.1.0 firebase_core: ^1.10.0 firebase_core_web: ^1.2.0 flutter: From 88b28f40de45d37dfffbb439899213249c177993 Mon Sep 17 00:00:00 2001 From: Salakar Date: Mon, 6 Dec 2021 11:43:15 +0000 Subject: [PATCH 50/51] fix macos podspec --- ...spec => flutterfire_installations.podspec} | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) rename packages/firebase_installations/firebase_installations/macos/{firebase_installations.podspec => flutterfire_installations.podspec} (81%) diff --git a/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec b/packages/firebase_installations/firebase_installations/macos/flutterfire_installations.podspec similarity index 81% rename from packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec rename to packages/firebase_installations/firebase_installations/macos/flutterfire_installations.podspec index 20de31aac8b2..5cef76bc1f0c 100644 --- a/packages/firebase_installations/firebase_installations/macos/firebase_installations.podspec +++ b/packages/firebase_installations/firebase_installations/macos/flutterfire_installations.podspec @@ -34,32 +34,25 @@ rescue end Pod::Spec.new do |s| - s.name = 'firebase_installations' - s.version = '0.0.1' - s.summary = 'A new flutter plugin project.' - s.description = <<-DESC -A new flutter plugin project. - DESC - s.homepage = 'http://example.com' + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] s.license = { :file => '../LICENSE' } - s.author = { 'Your Company' => 'email@example.com' } + s.authors = 'The Chromium Authors' s.source = { :path => '.' } s.source_files = 'Classes/**/*' - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/*.h' - - s.platform = :osx, '10.11' + s.platform = :osx, '10.12' - s.swift_version = '5.5' - + # Flutter dependencies s.dependency 'FlutterMacOS' # Firebase dependencies - s.dependency 'firebase_core' s.dependency 'Firebase/CoreOnly', "~> #{firebase_sdk_version}" s.dependency 'Firebase/Installations', "~> #{firebase_sdk_version}" - + s.static_framework = true s.pod_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\@\\\"#{library_version}\\\" LIBRARY_NAME=\\@\\\"flutter-fire-installations\\\"", From 0e8592ae0a1a8041feede7c2e927163f2219487a Mon Sep 17 00:00:00 2001 From: Salakar Date: Mon, 6 Dec 2021 12:47:41 +0000 Subject: [PATCH 51/51] - --- .../macos/flutterfire_installations.podspec | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/firebase_installations/firebase_installations/macos/flutterfire_installations.podspec b/packages/firebase_installations/firebase_installations/macos/flutterfire_installations.podspec index 5cef76bc1f0c..bd7272bb3211 100644 --- a/packages/firebase_installations/firebase_installations/macos/flutterfire_installations.podspec +++ b/packages/firebase_installations/firebase_installations/macos/flutterfire_installations.podspec @@ -48,6 +48,7 @@ Pod::Spec.new do |s| # Flutter dependencies s.dependency 'FlutterMacOS' + s.dependency 'firebase_core' # Firebase dependencies s.dependency 'Firebase/CoreOnly', "~> #{firebase_sdk_version}"